少しぎこちない方法で問題に取り組んでいると思います。
このブロブキーを提供するのはブロブストアの問題ではありません。あなたができることは次のとおりです。
- ファイルのアップロードをキャッチするアップロード サーブレットを作成する
- バイトを取得し、AppEngine File API を使用して保存します
ここでお見せしましょう(私のプロジェクトの作業コードブロック):
@POST
@Consumes("multipart/form-data")
@Path("/databases/{dbName}/collections/{collName}/binary")
@Override
public Response createBinaryDocument(@PathParam("dbName") String dbName,
@PathParam("collName") String collName,
@Context HttpServletRequest request, @Context HttpHeaders headers,
@Context UriInfo uriInfo, @Context SecurityContext securityContext) {
try {
ServletFileUpload upload = new ServletFileUpload();
FileItemIterator fileIterator = upload.getItemIterator(request);
while (fileIterator.hasNext()) {
FileItemStream item = fileIterator.next();
if ("file".equals(item.getFieldName())){
byte[] content = IOUtils.toByteArray(item.openStream());
logger.log(Level.INFO, "Binary file size: " + content.length);
logger.log(Level.INFO, "Mime-type: " + item.getContentType());
String mimeType = item.getContentType();
FileService fileService = FileServiceFactory.getFileService();
AppEngineFile file = fileService.createNewBlobFile(mimeType);
String path = file.getFullPath();
file = new AppEngineFile(path);
boolean lock = true;
FileWriteChannel writeChannel = fileService.openWriteChannel(file, lock);
writeChannel.write(ByteBuffer.wrap(content)); // This time we write to the channel directly
writeChannel.closeFinally();
BlobKey blobKey = fileService.getBlobKey(file);
} else if ("name".equals(item.getFieldName())){
String name=IOUtils.toString(item.openStream());
// TODO Add implementation
}
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
ご覧のように、Blobstore は「画像」を提供する一部にすぎません。ファイル名をデータストアに保存するなど、これらの画像またはバイナリ データを Blobstore に取得する API または何かを自分で作成する必要があります。
もう 1 つ必要なことは、Blobstore からクライアントにデータを送信するための API またはインターフェイスです。
- 次のよう
@GET
なクエリ パラメータを持つリソースのように?filename=whatever
- 次に、このファイル名に関連付けられているブロブキーをデータストアから取得します
これは単純化された例にすぎません。必要に応じて、ファイル名と Blobkey を保存する必要があります。つまり、適切なコンテナーとユーザーに保存する必要があります。
Blobstore API と Image API を直接使用できますが、さらに制御する必要がある場合は、独自の API を設計する必要があります。とにかくそれほど難しいことではなく、Apache Jersey と JBoss Resteasy は GAE と完全に連携します。