0

以下のコードを使用して、ファイルを BLOB としてアップロードできます。

<form action="<%= blobstoreService.createUploadUrl("/upload") %>" method="post" enctype="multipart/form-data">
<input type="file" name="myFile">
<input type="submit" value="Submit">
</form>

しかし、私の場合、Apache Common File Uploaderを使用してファイルをアップロードしています。したがって、私のフォームアクションは次のようになります。

<form action="/upload" method="post" enctype="multipart/form-data">

今、私のサーブレットでは、ファイルを InputStream として取得しています。ファイルを同じサーブレット ファイル内の BLOB として変換したい場合、どうすれば変換できますか。アイデアを教えてください。

更新しました

ファイルをブロブストアに書き込んでみました 私のコードは次のとおりです。

FileService fileService = FileServiceFactory.getFileService();
AppEngineFile file = fileService.createNewBlobFile(mime,fileName);
boolean lock = true;
FileWriteChannel writeChannel = fileService.openWriteChannel(file, lock);
byte[] b1 = new byte[BUFFER_SIZE];
int readBytes1 = is.read(b1, 0, BUFFER_SIZE);
while (readBytes1 != -1) {
writeChannel.write(ByteBuffer.wrap(b1, 0, BUFFER_SIZE));}

これで、アプリ エンジンにファイルをアップロードできます。ファイルには BLOB 値が保存されますが、BLOB 値を表示できません。この行を使用する<%= blobstoreService.createUploadUrl("/upload") %>と、アプリエンジンに「View Blob」オプションが表示されますが、現在は表示されません。また、Blob リストを使用してファイルを表示すると、表示されず、「0」バイトと表示されます。ファイルではなくブロブキーを保存するだけだと思います。それを解決するためのアイデアを教えてください。

4

2 に答える 2

3

これを行うには、次の 2 つの方法があります。

  1. 提供されたブロブストア アップロード機能を使用します。クライアントはサーバーを呼び出し、サーバーはワンタイム アップロード URL (を介して作成blobstoreService.createUploadUrl("/upload")) で応答します。次に、この URL を Apache Common File Uploader で 1 回だけ使用できます。

  2. コードでアップロードを処理します。マルチパート ハンドラーを作成し、 Files API を介してプログラムでデータを blobstore に保存します

オプション 2. は、標準の GAE 32Mb 要求/応答サイズ制限に該当することに注意してください。オプション 1. には 2Gb のファイル アップロード制限があります。

于 2013-01-02T10:50:15.297 に答える
1

このようなことをします:

        DiskFileItemFactory factory = new DiskFileItemFactory();
        ServletFileUpload upload = new ServletFileUpload(factory);
        upload.setSizeMax(maxPostSize);

        for (FileItemIterator it = upload.getItemIterator(request); it.hasNext();) {
            FileItemStream item = it.next();
            final byte[] fileData = IOUtils.toByteArray(item.openStream());

            // store data

        }

次に、をデータストアに保存しfileDataます。itemを使用して、がフォームフィールドであるかどうかを確認してくださいitem.isFormField()

または、ストリーミングAPIを確認してください。

フォームフィールドがあると仮定すると、Blobstoreへのファイルの保存は次のよう<input type="file" name="myFile">に行われます。

Map<String, BlobKey> blobs = blobstoreService.getUploadedBlobs(request);
BlobKey blobKey = blobs.get("myFile");
于 2013-01-02T09:56:53.040 に答える