我正在使用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标头。这是实现理想目标的最佳方法吗?
答案 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
属性。