我正在尝试使用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博客文章中提出的解决方案感到有点迷失。
答案 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