GAE/J - Blobstore - 如何确定文件未上传

3
我正在开发一个网页应用程序,使用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();
            }
4个回答

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

2
非常好,谢谢这有所帮助..但是对我来说blobInfo.getSize返回> 0..所以我最终还是通过blobInfo.getFilename()获取文件名..如果没有上传文件,则其长度始终为零。if(fileName.length()<=0) { blobstoreService.delete(blobkey); } - Jagdish

5

在开发环境中,如果用户提交一个空的文件上传表单,blobkey将为null,但在生产环境中,它将是非null的,且blob为空。因此,您应该检查这两种情况。


1
没错!昨天我部署应用程序时就提到过这个。在我的本地机器上,未选择的文件键是空的。很遗憾,没有任何官方文档关于此问题。 - Subtle Fox

1
我假设您正在使用表单直接提交到上传URL?如果是这样,您可能希望在表单本身上添加验证代码。如果他们选择了表单,则执行异步请求以获取要提交的上传URL。如果没有附加表单,则提交到不处理Blob的不同URL。
例如,当他们提交时,如果已附加表单,请提交到生成上传URL的servlet,如下所示:
    BlobstoreService service = BlobstoreServiceFactory
            .getBlobstoreService();
    String url = service
            .createUploadUrl("/uploadurl");

    return url;

谢谢David,那也是一个有用的提示。 - Jagdish

1

提醒一下,展示你的代码可能更有帮助。

基本上,即使文件上传是可选的,你仍然需要通过 blobstore 上传 URL 发送表单提交的请求。如果上传了文件,你从 GAE 获取控制权的上传处理程序将能够获取所有 blob 的列表(映射)。如果没有上传文件,则该列表将为空。从那里开始,你可以按自己的选择处理其余的表单提交。

关于如何获取已上传 blob 的列表的具体信息,请参见文档的 this section,但基本上你要进行以下调用:

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

如果该映射为空,则没有上传 blob。


我在问题部分上面更新了代码。并且我确实有一个if条件来检查是否为空或大于零,但它仍然会上传内容类型为“application/octet-stream”的空白“(unnamed)”文档并创建密钥。也许我没有理解这个例子或者没有正确验证这个条件。 - Jagdish
我不确定该告诉你什么。这对我来说完美无缺。当我不上传文件时,地图的大小为零。 - csturtz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接