【问题标题】:App Engine - download files from Cloud StorageApp Engine - 从 Cloud Storage 下载文件
【发布时间】:2017-12-18 08:33:41
【问题描述】:

我正在使用 Python 2.7 和 Reportlab 创建 .pdf 文件,以便在我的应用引擎系统中显示/打印。如果这很重要,我正在使用 ndb.Model 来存储数据。

我能够在线为单个客户生成银行对账单的等价物。那是;用户点击屏幕上的“pdf”按钮,.pdf 语句就会出现在屏幕上的新选项卡中,就像它应该的那样。

我正在使用以下代码将 .pdf 文件成功保存到 Google Cloud Storage

buffer = StringIO.StringIO()
self.p = canvas.Canvas(buffer, pagesize=portrait(A4))
self.p.setLineWidth(0.5)

try:

    # create .pdf of .csv data here

finally:
    self.p.save()
    pdfout = buffer.getvalue()
    buffer.close()

    filename = getgcsbucket() + '/InvestorStatement.pdf'  
    write_retry_params = gcs.RetryParams(backoff_factor=1.1)

    try:
        gcs_file = gcs.open(filename,
                            'w',
                            content_type='application/pdf',
                            retry_params=write_retry_params)
        gcs_file.write(pdfout)
    except:
        logging.error(traceback.format_exc())
    finally:
        gcs_file.close()

我正在使用下面的代码来创建一个所有文件的列表以显示在屏幕上,它显示了上面存储的所有文件。

allfiles = []

bucket_name = getgcsbucket()

rfiles = gcs.listbucket(bucket_name)
for rfile in rfiles:
    allfiles.append(rfile.filename)

return allfiles

我的屏幕 (html) 显示 ([Delete] 和文件名) 行。当用户点击【删除】按钮时,下面的删除代码sn -p 起作用(文件名是/bucket/filename,完成)

filename = self.request.get('filename')
try:
    gcs.delete(filename)
except gcs.NotFoundError:
    pass

我的问题 - 鉴于我在屏幕上有一个文件列表,我希望用户单击文件名并将该文件下载到用户的计算机。在 Google 的 Chrome 浏览器中,这将导致文件被下载,其名称显示在屏幕的左下方。

还有一点,上面的例子是针对 .pdf 文件的。我还必须在列表中显示 .csv 文件,并希望它们也被下载。我只想下载文件,不需要显示。

所以,我想要一个像...一样的sn-p

filename = self.request.get('filename')
try:
    gcs.downloadtousercomputer(filename) ???
except gcs.NotFoundError:
    pass

我想我已经尝试了在这里和其他地方能找到的一切。对不起,我已经啰嗦了。对我有什么提示吗?

【问题讨论】:

    标签: python google-app-engine pdf


    【解决方案1】:

    要下载文件而不是在浏览器中显示,您需要在响应中添加标题:

    self.response.headers["Content-Disposition"] = 'attachment; filename="%s"' % filename
    

    您可以指定如上所示的文件名,它适用于任何文件类型。

    【讨论】:

      【解决方案2】:

      您可以尝试的一种解决方案是从存储桶中读取文件并将内容打印为具有正确标题的响应:

      import cloudstorage
      ...
      def read_file(self, filename):        
          bucket_name = "/your_bucket_name"        
          file = bucket_name + '/' + filename        
          with cloudstorage.open(file) as cloudstorage_file: 
              self.response.headers["Content-Disposition"] = str('attachment;filename=' + filename)            
              contents = cloudstorage_file.read()         
              cloudstorage_file.close()            
              self.response.write(contents)
      

      这里的文件名可能是您作为 GET 参数发送的内容,并且需要是存储桶中存在的文件,否则您将引发异常。

      [1] 您可以在此处找到示例。

      [1]https://cloud.google.com/appengine/docs/standard/python/googlecloudstorageclient/read-write-to-cloud-storage

      【讨论】:

      • JCJ - 感谢这个工作示例。我查看了您的两个链接,但都没有显示像您的示例那样的任何内容。第一个显示了除了如何将文件从 gcs 中获取到 pc 之外的所有内容 :( 再次感谢您的帮助。
      • 试试这个github.com/GoogleCloudPlatform/python-docs-samples/blob/master/… 示例。使用 python sn-ps.py bucket-name download source.file dest.file 运行它,将文件从存储桶下载到本地机器。
      猜你喜欢
      • 2020-03-24
      • 2015-07-07
      • 2013-01-26
      • 2018-07-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-23
      • 1970-01-01
      相关资源
      最近更新 更多