如何使用谷歌应用引擎将上传文件作为blob在servlet中获取

时间:2013-01-02 07:50:49

标签: java google-app-engine

我可以使用以下代码将文件上传为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">

现在在我的servlet中将文件作为InputStream获取。如果我想在同一个servlet文件中将文件转换为blob,我该如何转换它。请建议我一个想法。

已更新

我尝试使用Writing files to blob store我的代码如下,

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));}

现在我可以在app引擎上传文件,它存储blob值,但我无法查看blob值。当我使用<%= blobstoreService.createUploadUrl("/upload") %>这一行时,我的应用程序引擎向我显示“查看Blob”选项,但现在它不在那里。当我使用blob列表查看文件时它没有显示并显示“0”字节。我认为它只存储blob键而不是文件。请建议我解决它的想法。

2 个答案:

答案 0 :(得分:3)

有两种方法可以做到这一点:

  1. 使用provided blobstore upload functionality:您的客户端呼叫服务器,该服务器使用一次性上传网址(通过blobstoreService.createUploadUrl("/upload")创建)进行回复。然后,您可以将此URL一次性使用Apache Common File Uploader。

  2. 处理代码中的上传内容:create a multipart handler然后save data to blobstore programmatically via Files API

  3. 请注意,选项2属于标准GAE 32Mb请求/响应大小限制。选项1.具有2Gb文件上载限制。

答案 1 :(得分: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()是否为表单字段。

或查看Streaming API

在Blobstore中存储文件已完成like this,假设您有表单字段<input type="file" name="myFile">

Map<String, BlobKey> blobs = blobstoreService.getUploadedBlobs(request);
BlobKey blobKey = blobs.get("myFile");