【问题标题】:Downloaded filename with Google App Engine Blobstore使用 Google App Engine Blobstore 下载的文件名
【发布时间】:2011-11-11 14:22:52
【问题描述】:
【问题讨论】:
标签:
python
google-app-engine
blobstore
【解决方案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)
【解决方案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 属性。