如何从GAE的blobstore下载具有原始文件名的文件?

4

一旦您将文件上传到Blobstore,它会将其重命名为类似于“s9QmBqJPuiVzWbySYvHVRg ==”这样的名称。 如果您导航到其“/ serve” URL以下载该文件,则下载的文件将以这些字母混合的方式命名。

是否有办法在上传时让下载的文件保留其原始文件名?

3个回答

6
使用BlobUploadHandler上传文件时,原始文件名将作为名称属性存储在新创建的BlobInfo实体中。
在Blob服务处理程序中,您可以指定该Blob应作为下载附件返回,并且您可以指定应使用什么名称保存它。
from google.appengine.ext import webapp
import urllib

class ServeHandler(blobstore_handlers.BlobstoreDownloadHandler):
  def get(self, blob_info_key=None):
    blob_info_key = str(urllib.unquote(blob_info_key))
    blob_info = retrieve_blob_info(blob_info_key)
    self.send_blob(blob_info, save_as=blob_info.filename)


blob_app = webapp.WSGIApplication([
  ('/_s/blob/([^/]+)', blob.ServeHandler),
], debug=config.DEBUG)

1
在使用实验性API直接将文件写入Blobstore时,是否有一种方法可以指定blob_info.filename? - kennysong
1
有一个相关的问题https://dev59.com/NVbTa4cB1Zd3GeqP9lBA - topless
1
是的,当通过文件API编写blob时,您可以为其指定一个名称,方法如下: file_name = files.blobstore.create( mime_type=content_type, _blobinfo_uploaded_filename=blob_name, ) - tzador

0

你所提到的代码是BlobInfo实体的关键,但原始文件名存储为属性。

如果你想通过文件名简单地下载文件,你可以使用我在ServeHandler中使用的这段代码,它适用于我的需求,可以通过文件名而不是blobstore key来下载文件:

class ServeHandler(blobstore_handlers.BlobstoreDownloadHandler):
  def get(self, resource):
    blobs = blobstore.BlobInfo.gql("WHERE filename = '%s'" %(urllib.unquote(resource)))
    if blobs.count(1) > 0:
        blob_info = blobstore.BlobInfo.get(blobs[0].key())
        self.send_blob(blob_info,save_as=True) 

0
在 GAE 管理员 控制台 中的 BLOB 查看器部分,当您查看单个 BLOB 时,视图下方右侧有一个下载按钮,如下面的屏幕截图所示。

enter image description here


我想知道是否多米诺骨牌总是显示下载按钮。我有一个类型为(application/x-compress)的文件,它也说太大无法预览 - 没有下载链接。 - nwaltham

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