使用 Google App Engine Blobstore 下载的文件名
Posted
技术标签:
【中文标题】使用 Google App Engine Blobstore 下载的文件名【英文标题】:Downloaded filename with Google App Engine Blobstore 【发布时间】:2011-11-11 14:22:52 【问题描述】:我正在使用 Google App Engine Blobstore 存储一系列文件类型(PDF、XLS 等),并试图找到一种机制,通过该机制,上传文件的原始文件名(存储在 blob_info 中)可以是用于命名下载的文件,即让用户在保存对话框中看到“some_file.pdf”而不是“very_long_db_key.pdf”。
我在文档中看不到任何允许这样做的内容:
http://code.google.com/appengine/docs/python/blobstore/overview.html
我在其他帖子中看到提示,您可以使用 blob_info 中的信息来设置 content-disposition 标头。这是实现预期目标的最佳方法吗?
【问题讨论】:
【参考方案1】:send_blob 函数中有一个可选的“save_as”参数。默认情况下,这设置为 False。将其设置为 True 将导致文件被视为附件(即,它将触发“保存/打开”下载对话框)并且用户将看到正确的文件名。
例子:
class ServeHandler(blobstore_handlers.BlobstoreDownloadHandler):
def get(self, resource):
resource = str(urllib.unquote(resource))
blob_info = blobstore.BlobInfo.get(resource)
self.send_blob(blob_info,save_as=True)
也可以通过传入一个字符串来覆盖文件名:
self.send_blob(blob_info,save_as='my_file.txt')
如果您想要打开而不是保存某些内容(例如 pdf),您可以使用 content_type 来确定行为:
blob_info = blobstore.BlobInfo.get(resource)
type = blob_info.content_type
if type == 'application/pdf':
self.response.headers['Content-Type'] = type
self.send_blob(blob_info,save_as=False)
else:
self.send_blob(blob_info,save_as=True)
【讨论】:
只是添加 - 如果原始文件名包含双引号,下载对话框将截断引号字符后的文件名。我通过在 blob 文件名中转义双引号来解决这个问题:self.send_blob(blob_info, save_as = blob_info.filename.replace('"', '\\"'))
(有一个相关的讨论关于这个here)【参考方案2】:
为了将来参考,此处记录了 save_as 和 BlobstoreDownloadHandler:
http://code.google.com/appengine/docs/python/tools/webapp/blobstorehandlers.html
看起来应该更容易找到。看看能不能改进。
【讨论】:
是的,一旦指出答案,我确实看到了。参考资料中似乎也缺少 send_blob:code.google.com/appengine/docs/python/blobstore/overview.html【参考方案3】:另一种选择是将文件名附加到下载 URL 的末尾。例如:
/files/AMIfv95HJJY3F75v3lz2EeyvWIvGKxEcDagKtyDSgQSPWiMnE0C2iYTUxLZlFHs2XxnV_j1jdWmmKbSVwBj6lYT0-G_w5wENIdPKDULHqa8Q3E_uyeY1gFu02Iiw9xm523Rxk3LJnqHf9n8209t4sPEHhwVOKdDF2A/prezents-list.doc
如果你使用 Jinja2 做模板,你可以像这样构造这样的 URL:
<a href="/files/blob_info.key()/blob_info.filename">file.filename</a>
那么您应该相应地调整您的 URL 映射,如下所示:
('/files/([^/]+)/?.*', DownloadHandler)
如果 URL 中有 blob 键,则可以忽略服务器端代码中的文件名。
这种方式的好处是图片或PDF等内容类型直接在浏览器中打开,方便快速查看。其他内容类型只会保存到磁盘。
【讨论】:
【参考方案4】:是的,这是最好的方法;只需使用给定的 Blobstore 键查询 BlobInfo 对象并使用其content-type
属性。
【讨论】:
以上是关于使用 Google App Engine Blobstore 下载的文件名的主要内容,如果未能解决你的问题,请参考以下文章
Blobstore 图像在 Google App Engine 开发服务器上消失
将 App Engine Datastore 中的 Blob 显示为图像
Gifs(animations) 可以在 App Engine 上工作,但不能在 localhost 上使用相同的代码通过使用 blob 存储
在 Google-App-Engine 中使用 HSQLDB
如何在 Google Cloud App Engine 上使用 PubSub 创建订阅者,该订阅者通过 Publisher 从 Google Cloud App Engine Flex 收听消息?