我正在开发Web应用程序并使用GAE / J blobstore教程http://code.google.com/appengine/docs/java/blobstore/overview.html我能够将文件上传到blobstore。
我的问题是我的“上传文件”选项在表单上是可选的。因此,用户可能会或可能不会选择在我的表单上上传文件。因此,由于此字段是可选的,我没有对此字段进行任何前期表单验证,但是当我提交表单“带有0kb文件的空白文档上传到blobstore”时,因为我无法确定用户是否已选择任何文件或不在servlet内。
我尝试过Apache文件上传(ServletFileUpload..etc),但每次都会一直返回null。
所以不确定,如何判断用户是否选择了要在servlet中上传的文件?
Map<String, BlobKey> blobs = blobstoreService.getUploadedBlobs(req);
if (blobs != null && blobs.size() > 0) {
BlobKey blobkey = blobs.get("myFile");
blobkeyStr = blobkey.getKeyString();
}
答案 0 :(得分:8)
您可以通过检查blob的大小来测试是否上传了blob。如果大小为零,则应删除blob。
BlobstoreService bs = BlobstoreServiceFactory.getBlobstoreService();
BlobKey blobKey = bs.getUploads(req).get("blob").get(0);
final BlobInfo blobInfo = new BlobInfoFactory().loadBlobInfo(blobKey);
long size = blobInfo.getSize();
if(size > 0){
//process blob
}else{
bs.delete(blobKey);
}
答案 1 :(得分:5)
在开发环境中,如果用户提交带有空文件上载的表单,则blobkey将为null,但在生产中它将为非null并且blob将为空。所以你应该检查两种情况。
答案 2 :(得分:1)
仅供参考,您可能更有助于展示您的代码。
基本上,即使你的文件上传是可选的,你仍然需要通过blobstore上传网址从表单提交发送请求。如果文件已上传,则从GAE获取控制权的上传处理程序将能够获取所有blob的列表(地图)。如果没有上传文件,该列表将为空。从那里,您可以根据自己的选择处理表单提交的其余部分。
有关如何获取上传blob列表的详细信息,请参阅文档的this section,但基本上您将进行此调用:
Map<String, BlobKey> blobs = blobstoreService.getUploadedBlobs(req);
如果该地图为空,则没有上传blob。
答案 3 :(得分:1)
我假设您使用表单直接提交到您的上传网址?如果是这样,您可能希望在表单上添加验证代码。如果他们选择了表单,则执行异步请求以获取要提交的上传网址。如果没有附加表单,则提交到不处理blob的其他URL。
例如,当他们提交时,如果附加了表单,请提交给生成上传URL的servlet,如下所示:
BlobstoreService service = BlobstoreServiceFactory
.getBlobstoreService();
String url = service
.createUploadUrl("/uploadurl");
return url;