1

こんにちは、管理者が画像をアップロードし、Google ユーザーがこれらの画像を表示できるようにするサーブレットを作成しようとしています。 /概要

画像をアップロードすると、非常に長い blobKey を使用してすぐに提供されますか? 自分自身のコピーを local_db.bin に保存します

私が見つけられないのは、使用するためにブロブキーを短縮する方法があるかどうかです? たとえば、ユーザーがアップロードしたすべての画像を表示するギャラリーが必要ですが、これまでのところ、データベースから画像を取得できる唯一の方法は、このようなものを呼び出すことです

res.sendRedirect("/serve?blob-key=" + blobKey.getKeyString())

しかし、これは1つの画像に対してのみ機能し、別のページに表示するには、新しいblobKeyをそれぞれハードコードする必要があります。つまり、ユーザーが新しい画像をアップロードするときに、コードを編集して新しい画像の新しいリンクを追加する必要があります画像?

基本的に私が知りたいのは、とにかく local_db.bin に格納されている各ブロブを簡単に定義できるかどうかです。

詳細についてはお気軽にお問い合わせください。

ありがとう

4

1 に答える 1

0

少しぎこちない方法で問題に取り組んでいると思います。

このブロブキーを提供するのはブロブストアの問題ではありません。あなたができることは次のとおりです。

  • ファイルのアップロードをキャッチするアップロード サーブレットを作成する
  • バイトを取得し、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 と完全に連携します。

于 2013-04-09T08:24:07.097 に答える