【问题标题】:Python App Engine serving files with Google Cloud StoragePython App Engine 使用 Google Cloud Storage 提供文件
【发布时间】:2023-03-23 23:02:01
【问题描述】:

我目前使用以下代码允许我的用户上传文件;

uploadurl = blobstore.create_upload_url('/process?session=' + session, gs_bucket_name='mybucketname')

我可以提供这样的图片;

imgurl = get_serving_url(blob_key, size=1600, crop=False, secure_url=True)

使用第一个代码片段中的方法上传内容后,blob 键包含encoded_gs_file:,这就是它知道从 Google Cloud Service 提供内容的方式,而不是标准的 blobstore。

但是,我不确定如何提供任何其他类型的文件(例如 .pdf 或 .rtf)。我希望内容显示在浏览器中,而是以下载的形式发送给客户端(因此他们会获得保存文件对话框并在他们的电脑保存)。

我该怎么做呢?谢谢。

【问题讨论】:

    标签: python google-app-engine google-cloud-storage


    【解决方案1】:

    使用 google serving_url 仅适用于图片。

    要从 blobstore 提供 pdf,您可以使用:

    class DynServe(blobstore_handlers.BlobstoreDownloadHandler):
    
        def get(self, resource):
    
            (blob_key, extension) = resource.rpartition('.')[::2]
            blob_info = blobstore.BlobInfo.get(blob_key)
            if not blob_info:
                logging.error('Blob NOT FOUND %s' % resource)
                self.abort(404)
    
            self.response.headers[b'Content-Type'] = mimetypes.guess_type(blob_info.filename)
            self.send_blob(blob_key, save_as=blob_info.filename)
    

    此处理程序的 webapp2 路由如下所示:

    webapp2.Route(r'/dynserve/<resource:(.*)>', handler=DynServe)
    

    服务:

    <a href="/dynserve/<blob_key>.pdf">PDF download</a>
    

    【讨论】:

    • 我不得不稍微修改一下以使其充分发挥作用,但您的回答非常有帮助。谢谢:)
    • @user2370602,你能发布你做了什么吗?这个答案似乎没有使用 GCS,我想看看它是如何完成的。
    • 我认为这个答案是不正确的,因为云存储文件没有 BlobInfo。访问 size 或 content_type 会引发 EntityNotFound 异常(仅在 SDK 上有效!)。
    • 是的,请参阅此答案:stackoverflow.com/questions/31299404/how-to-read-data-from-google-cloud-storage-based-on-its-blobkey
    【解决方案2】:

    我将根据@voscausa 的回答回答我自己的问题

    这就是我的处理程序的样子(在一个名为 view.py 的文件中);

    class DynServe(blobstore_handlers.BlobstoreDownloadHandler):
    def get(self, resource):
        blob_key = resource
    
        if not blobstore.get(blob_key):
            logging.warning('Blob NOT FOUND %s' % resource)
            self.abort(404)
            return
        else:
            blob_info = blobstore.BlobInfo.get(blob_key)
    
        self.send_blob(blob_key, save_as=blob_info.filename)    
    

    app.yaml 需要这个;

    - url: /download/.*
    script: view.app
    secure: always
    

    secure: always 是可选的,但我在处理用户数据时总是使用它。

    把这个放在view.py的底部;

    app = webapp.WSGIApplication([('/download/([^/]+)?', DynServe),
                                     ], debug=False)
    

    现在访问 /download/BLOB_KEY_HERE。 (您可以检查数据存储中的 blob 密钥)

    这是一个可与标准 blob 存储和 Google 云服务一起使用的完整示例。

    注意:作为 GCS 一部分的所有 blob 键都将以 encoded_gs_file: 开头,而那些不在标准 blobstore 中的键;应用引擎自动使用它来确定文件的位置

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-22
      • 2015-07-07
      • 2020-04-04
      • 2014-01-18
      • 1970-01-01
      • 2021-11-05
      相关资源
      最近更新 更多