【问题标题】:how to get uploaded file as blobs in servlet using google app engine如何使用谷歌应用引擎将上传的文件作为servlet中的blob
【发布时间】:2013-01-02 07:50:48
【问题描述】:

我可以使用以下代码将文件作为 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));}

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

【问题讨论】:

    标签: java google-app-engine


    【解决方案1】:

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

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

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

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

    【讨论】:

      【解决方案2】:

      做这样的事情:

              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,假设您有表单字段 &lt;input type="file" name="myFile"&gt;

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

      【讨论】:

      • 谢谢你的回复,能说一下从哪里导入这个IOUtils
      • 我尝试使用此示例链接stackoverflow.com/questions/13837536/… 在上传 servlet 中,我按照所示操作,我可以将数据上传到云存储。我需要的是如何将文件转换为 blobstore 值
      • 我已经尝试过了,它向我显示了这样的错误java.lang.IllegalStateException: Must be called from a blob upload callback request.
      • 仅供参考,我没有上传 blob。我正在通过 apache 文件上传器上传普通文件。在 servlet 中获取文件后,我不知道如何将其转换为 blob 文件
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-07-27
      • 1970-01-01
      • 1970-01-01
      • 2012-12-01
      • 1970-01-01
      • 2013-05-19
      • 1970-01-01
      相关资源
      最近更新 更多