如何从GAE的blobstore下载原始文件名的文件?

时间:2012-08-30 16:01:51

标签: google-app-engine http-headers filenames blobstore

将文件上传到blobstore后,会将其重命名为“s9QmBqJPuiVzWbySYvHVRg ==”。如果您导航到其“/ serve”URL以下载文件,则下载的文件将被命名为这个混乱的字母。

有没有办法让下载的文件在上传时保留其原始文件名?

3 个答案:

答案 0 :(得分:6)

使用BlobUploadHandler上传文件时 原始文件名作为name属性存储在新创建的BlobInfo实体中。

在blob服务处理程序中,您可以指定blob应作为下载附件返回,并且您可以使用

指定保存的名称
from google.appengine.ext import webapp
import urllib

class ServeHandler(blobstore_handlers.BlobstoreDownloadHandler):
  def get(self, blob_info_key=None):
    blob_info_key = str(urllib.unquote(blob_info_key))
    blob_info = retrieve_blob_info(blob_info_key)
    self.send_blob(blob_info, save_as=blob_info.filename)


blob_app = webapp.WSGIApplication([
  ('/_s/blob/([^/]+)', blob.ServeHandler),
], debug=config.DEBUG)

答案 1 :(得分:0)

在GAE admin console,BLOB查看器部分,当您查看单个BLOB时,查看器右下角有一个下载按钮,如下面的屏幕截图所示。

enter image description here

答案 2 :(得分:0)

您引用的代码是BlobInfo实体的键,但原始文件名存储为属性。

如果你想通过文件名下载文件的简单方法,你可以使用我用于我的ServeHandler的代码,它可以满足我的需要,通过文件名而不是blobstore密钥下载文件:

class ServeHandler(blobstore_handlers.BlobstoreDownloadHandler):
  def get(self, resource):
    blobs = blobstore.BlobInfo.gql("WHERE filename = '%s'" %(urllib.unquote(resource)))
    if blobs.count(1) > 0:
        blob_info = blobstore.BlobInfo.get(blobs[0].key())
        self.send_blob(blob_info,save_as=True)