如何上传多个文件到BlobStore?

3 投票
3 回答
3213 浏览
提问于 2025-04-16 10:24

我正在尝试通过一个表单上传多个文件到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

我使用最新版本的plupload,成功让UploadQueue在GAE上运行,下面这段代码就是实现的关键。需要注意的是,这段代码是用CoffeeScript写的,不过如果你需要的话,转换成JavaScript应该也不难。代码假设你从服务器得到了一些json格式的数据,内容是{url:"gae生成的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
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>

然后在你的表单处理程序里,你可以这样做(具体取决于你使用的网络框架):

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

每个文件都需要一个独特的上传网址,所以我猜当三个文件同时上传到同一个网址时,可能会发生一些奇怪的事情。

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

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

撰写回答