使用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 header)。这样做是实现我想要的效果的最佳方法吗?
4 个回答
另一种选择是把文件名加到下载链接的最后面。例如:
/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这样的内容可以直接在浏览器中打开,这样查看起来很方便。其他类型的内容则会直接保存到硬盘上。
为了将来方便查找,save_as 和 BlobstoreDownloadHandler 的相关文档在这里:
http://code.google.com/appengine/docs/python/tools/webapp/blobstorehandlers.html
看起来这些内容应该更容易找到。我们来看看能否改进一下。
在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)