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

10 投票
4 回答
3119 浏览
提问于 2025-04-17 01:36

我正在使用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 header)。这样做是实现我想要的效果的最佳方法吗?

4 个回答

1

另一种选择是把文件名加到下载链接的最后面。例如:

/files/AMIfv95HJJY3F75v3lz2EeyvWIvGKxEcDagKtyDSgQSPWiMnE0C2iYTUxLZlFHs2XxnV_j1jdWmmKbSVwBj6lYT0-G_w5wENIdPKDULHqa8Q3E_uyeY1gFu02Iiw9xm523Rxk3LJnqHf9n8209t4sPEHhwVOKdDF2A/prezents-list.doc

如果你使用Jinja2来做模板,你可以这样构造这个链接:

<a href="/files/{{blob_info.key()}}/{{blob_info.filename}}">{{file.filename}}</a>

然后你需要相应地调整你的链接映射,变成这样:

('/files/([^/]+)/?.*', DownloadHandler)

如果你的链接里有blob键,你可以在服务器端的代码中忽略文件名。

这种方法的好处是,像图片或PDF这样的内容可以直接在浏览器中打开,这样查看起来很方便。其他类型的内容则会直接保存到硬盘上。

1

为了将来方便查找,save_as 和 BlobstoreDownloadHandler 的相关文档在这里:

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

看起来这些内容应该更容易找到。我们来看看能否改进一下。

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)

撰写回答