【发布时间】:2012-08-25 10:11:33
【问题描述】:
将文件上传到 blobstore 后,它会将其重命名为“s9QmBqJPuiVzWbySYvHVRg==”。如果您导航到它的“/serve” URL 来下载文件,下载的文件将被命名为这个乱七八糟的字母。
有没有办法让下载的文件在上传时保留其原始文件名?
【问题讨论】:
标签: google-app-engine http-headers filenames blobstore
将文件上传到 blobstore 后,它会将其重命名为“s9QmBqJPuiVzWbySYvHVRg==”。如果您导航到它的“/serve” URL 来下载文件,下载的文件将被命名为这个乱七八糟的字母。
有没有办法让下载的文件在上传时保留其原始文件名?
【问题讨论】:
标签: google-app-engine http-headers filenames blobstore
在 GAE 管理员console,BLOB 查看器部分,当您查看单个 BLOB 时,查看器的右下方有一个下载按钮,如下面的屏幕截图所示。
【讨论】:
当使用BlobUploadHandler 上传文件时
原始文件名作为名称属性存储在新创建的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)
【讨论】:
您引用的代码是 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)
【讨论】: