使用HTML5多文件输入将多个图像上传到GAE Blobstore

时间:2011-08-19 15:58:16

标签: java google-app-engine blobstore image-uploading multiple-files

我正在尝试使用HTML5多文件输入将多个图像文件存储到GAE Blobstore。

由于我的网络应用程序将被摄影师用于批量上传照片,因此在客户端浏览器上启用多个文件选择绝对关键(一次上传200多张照片会很痛苦)

客户端HTML看起来像这样:

   <form action = "/upload" method="post" enctype="multipart/form-data">
     <input type="file" name="myFiles[]" multiple="true"/>
     <input type="submit"/>
   </form>

在服务器端,Java HttpServlet将用于存储照片组:

public class PhotoUploadServlet extends HttpServlet {

  @Override
  protected void doPost(HttpServletRequest req, HttpServletResponse resp)
      throws ServletException, IOException {
      //Upload each photo of myFiles[] in sequence to the GAE Blobstore
  }

我打算使用here解释的程序单独存储每张照片。

问题:我不知道如何从HttpServletRequest的myFiles []参数中单独提取每个图像。

有人可以解释我如何将myFiles []参数解释为易于按顺序使用的东西,类似于List<SomeImageType>。然后,我可以轻松地将List<SomeImageType>中的每张照片单独保存到Blobstore!

提前致谢!

P.S。:我已经看过this post了,但由于我不懂Python,我对Nick Johnson博客文章中提出的解决方案感到有点迷失。

1 个答案:

答案 0 :(得分:3)

在servlet中,使用以下命令获取blob:

Map<String, BlobKey> blobs = blobstoreService.getUploadedBlobs(req);

但是你需要一个小的黑客来改变文件的名称,否则blobs字段只包含一个键:

<script type="text/javascript">
   function uploadFile() {
     if (window.File && window.FileList) {
      var fd = new FormData();
      var files = document.getElementById('fileToUpload').files;
      for (var i = 0; i < files.length; i++) {  
        fd.append("file"+i, files[i]);
      }
      var xhr = new XMLHttpRequest();
      xhr.open("POST", document.getElementById('uploadForm').action);
      xhr.send(fd);
    } else {
      document.getElementById('uploadForm').submit();   //no html5
    }
}
</script>

<form id="uploadForm" enctype="multipart/form-data" method="post"
        action=<%=blobstoreService.createUploadUrl("/upload") %>">
   <input type="file" name="fileToUpload" id="fileToUpload" multiple />
   <input type="button" onclick="uploadFile();" value="Upload" />
</form>

这是GAE问题:http://code.google.com/p/googleappengine/issues/detail?id=3351