【问题标题】:GAE/J - Blobstore - how to determine if file is not uploadedGAE/J - Blobstore - 如何确定文件是否未上传
【发布时间】:2012-03-12 19:49:22
【问题描述】:

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

【问题讨论】:

    标签: google-app-engine


    【解决方案1】:

    您可以通过检查 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);
    }
    

    【讨论】:

    • 太好了,谢谢你,这有帮助.. 虽然对我来说 blobInfo.getSize 返回 > 0 .. 所以我最终也通过 blobInfo.getFilename() 获取文件名 .. 如果它的长度始终为零没有文件上传。 if(fileName.length()
    【解决方案2】:

    在开发环境中,如果用户提交一个带有空文件上传的表单,blobkey 将为空,但在生产环境中它将为非空,并且 blob 将为空。所以你应该检查这两种情况。

    【讨论】:

    • 没错!我昨天在部署我的应用程序时提到了它。在我的本地机器上,未选择文件的键是空的。遗憾的是没有任何官方文档关于
    【解决方案3】:

    仅供参考,显示代码可能对您更有帮助。

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

    有关如何获取已上传 Blob 列表的详细信息,请参阅文档的 this section,但基本上您将进行此调用:

    Map&lt;String, BlobKey&gt; blobs = blobstoreService.getUploadedBlobs(req);

    如果该地图为空,则表示没有上传任何 blob。

    【讨论】:

    • 我在问题部分更新了上面的代码。而且我确实有 if 条件来检查是否为 null 或大于零,它仍然上传内容类型为“application/octet-stream”的空“(未命名)”文档并创建密钥。可能是我不理解这个例子或者没有正确验证这个条件。
    • 我不知道该告诉你什么。这对我来说非常有效。不上传文件时,地图大小为零。
    【解决方案4】:

    我假设您正在使用表单直接提交到您的上传 URL?如果是这样,您可能希望在表单本身上添加验证代码。如果他们选择了表单,则执行异步请求以获取要提交的上传 url。如果没有附加表单,则提交到不处理 blob 的不同 URL。

    因此,例如,当他们提交时,如果附加了表单,请提交到生成上传 URL 的 servlet,如下所示:

        BlobstoreService service = BlobstoreServiceFactory
                .getBlobstoreService();
        String url = service
                .createUploadUrl("/uploadurl");
    
        return url;
    

    【讨论】:

    • 谢谢你,大卫,这也很有帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-18
    • 2014-01-06
    • 2014-10-10
    • 2013-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多