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

时间:2012-03-12 19:49:23

标签: google-app-engine

我正在开发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();
            }

4 个答案:

答案 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;