使用Google App Engine Blobstore下载的文件名

10
我正在使用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标头。这是实现所需目标的最佳方法吗?

4个回答

12

在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('"', '\\"'))(这里有一个相关的讨论:https://dev59.com/SXVD5IYBdhLWcg3wGHeu) - Dave Hollingworth

1
另一个选择是将文件名附加到下载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这样的内容类型可以直接在浏览器中打开,非常方便快速查看。其他内容类型将只保存到磁盘上。

1

是的,我确实看到了一旦答案被指出。send_blob 似乎也在参考资料中缺失:http://code.google.com/appengine/docs/python/blobstore/overview.html - notreadbyhumans

0

是的,这是最好的方法;只需使用给定的Blobstore键查询BlobInfo对象并使用其content-type属性。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接