【问题标题】:How to upload multiple files to BlobStore?如何将多个文件上传到 BlobStore?
【发布时间】:2011-06-13 08:43:01
【问题描述】:

我正在尝试将表单中的多个文件上传到 BlobStore。

表格:

<form action="{{upload_url}}" method="POST" enctype="multipart/form-data">
  <label>Key Name</label><input type="text" name="key_name" size="50"><br/>
  <label>name</label><input type="text" name="name" size="50"><br/>
  <label>image</label><input type="file" name="image" size="50"><br/> 
  <label>thumb</label><input type="file" name="thumb" size="50"><br/> 
  <input type="submit" name="submit" value="Submit">
</form>

然后我尝试为每个上传的文件获取 BlobInfo 对象:

def post(self):
    image_upload_files = self.get_uploads('image') 
    thumb_upload_files = self.get_uploads('thumb') 
    image_blob_info = image_upload_files[0]
    thumb_blob_info = thumb_upload_files[0]

我看到一些奇怪的行为。这两个文件都进入了 BlobStore,但我不知道如何获取密钥以便我可以将它们存储在另一个实体上。上面的代码设法获得了 image_blob_info 的密钥,但没有获得 thumb_blob_info 的密钥。我不明白如何使用 get_uploads。我想通过表单传递多个文件,然后按名称获取它们,以便我可以将它们存储在另一个实体上的适当 BlobReferenceProperties 中。

【问题讨论】:

  • 我最终做的是创建两个 upload_url 变量,因为我只需要一次上传两个文件。如果你有n个文件要上传,Karl引用的解决方案很好(但实现起来并不容易)。
  • 您要求用户上传缩略图是有原因的吗?您是否知道 get_serving_url,它可以让您从全尺寸图像生成缩略图?
  • 这是一个管理页面,作为 BlobStore 仅支持表单 POST(您不能以编程方式存储 url)这一事实的解决方法。话虽如此,我不知道get_serving_url。那是 BlobStore 的一部分吗?
  • 我一直在努力让 plupload 人员在每次上传发生一段时间之前支持异步工作。我们快要到了。关注github.com/moxiecode/plupload/issues/issue/73

标签: python google-app-engine forms google-cloud-datastore blobstore


【解决方案1】:

使用最新版本的 plupload,我可以通过这段代码让 UploadQueue 与 GAE 一起工作。请注意,它是 CoffeeScript,但如果您确实需要,应该很容易转换回 JavaScript。它假设你从你的服务器得到一些 json 作为 {url:"gae generated url"}

    $("#fileUploader").pluploadQueue
        runtimes : 'html5,html4'
        use_query_string : false
        max_file_size : '3mb'
        multipart: true
        unique_names : true
        multiple_queues : true
        filters : [{title : "Image files", extensions : "jpg,gif,png"}]
        preinit:
            UploadFile: (up, file) ->
                $.ajax
                    url: '/api/upload/url'
                    async: false
                    success: (data) ->
                        up.settings.url = data.url

【讨论】:

    【解决方案2】:

    您可以将文件发布到相同的名称,然后是[],这将发布一个数组:

    <form action="{{upload_url}}" method="POST" enctype="multipart/form-data">
      <label>Key Name</label><input type="text" name="key_name" size="50"><br/>
      <label>name</label><input type="text" name="files[]" size="50"><br/>
      <label>image</label><input type="file" name="files[]" size="50"><br/> 
      <label>thumb</label><input type="file" name="thumb" size="50"><br/> 
      <input type="submit" name="submit" value="Submit">
    </form>
    

    然后在您的表单处理程序中,您可以像这样(取决于您的网络框架):

    for uploaded_file in request.FILES.getlist('files'):
        #do something with uploaded_file
    

    【讨论】:

      【解决方案3】:

      每个文件都需要自己唯一的上传 url,所以我猜当所有三个文件都发布到同一个 url 时会发生一些古怪的事情。

      Nick Johnson 的博文中描述了支持多文件上传的最佳解决方案:

      http://blog.notdot.net/2010/04/Implementing-a-dropbox-service-with-the-Blobstore-API-part-3-Multiple-upload-support

      【讨论】:

      • 尼克博客上的解决方案比我需要的要多得多。但这里有帮助的答案是“每个文件都需要自己唯一的上传网址”。
      • 如果每个文件都需要自己唯一的上传url,为什么BlobstoreUploadHandler.get_uploads()会返回BlobInfo对象列表? Blobstore 似乎需要一张图片,但 BlobstoreUploadHandler 似乎旨在处理多张图片。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-30
      • 2012-07-29
      • 1970-01-01
      • 2015-06-18
      相关资源
      最近更新 更多