使用 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 收听消息?

使用 Google App Engine 签名的 Google Cloud Storage 网址