使用Google App Engine Blobstore下载文件名

时间:2011-09-06 19:11:35

标签: python google-app-engine blobstore

我正在使用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 个答案:

答案 0 :(得分: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')

如果您想要打开某些内容(例如pdfs)而不是保存,则可以使用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)

答案 1 :(得分:1)

为了将来参考,此处记录了save_as和BlobstoreDownloadHandler:

http://code.google.com/appengine/docs/python/tools/webapp/blobstorehandlers.html

看起来它应该更容易找到。让我们看看它是否可以改进。

答案 2 :(得分: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等内容类型,便于快速查看。其他内容类型将保存到磁盘。

答案 3 :(得分:0)

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