如何将多个文件上传到BlobStore?

时间:2011-01-21 19:09:17

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

我正在尝试将表单中的多个文件上传到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中。

3 个答案:

答案 0 :(得分:5)

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

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

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

答案 1 :(得分:1)

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

<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>

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

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

答案 2 :(得分:0)

使用最新版本的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