【问题标题】:images.get_serving_url failing for GCS image blobs对于 GCS 图像 blob,images.get_serving_url 失败
【发布时间】:2021-06-22 18:23:48
【问题描述】:

我最近使用 Google Cloud Platform (gcloud) 部署了一个较旧的 (Python 2.7) Google App Engine 应用,因为 appcfg 已停用。我在使用 images.get_serving_url 时遇到问题,不适用于上传的图像 blob。图片 API 返回“TransformationError”。在切换到谷歌云平台之前,这段代码在生产环境中工作了多年。

需要注意的一点是,Google Cloud Platform 为 blob 创建了一个默认存储桶。以前,我认为 GAE 使用的是 Blobstore,所以尽管这种变化对开发人员来说是透明的,但可能在幕后发生了很多事情。我认为由于某种原因,我的应用在为存储在云存储桶中的文件创建图像 url 时遇到问题。

我做了一个非常简单的测试用例来复制这个问题。是否有新要求,或者这是否可行?

class testUpload(webapp.RequestHandler):
    def get(self):
        uploadUrl = blobstore.create_upload_url('/testUploadHandler')
        print("Generated upload url: %s" % uploadUrl)

        self.response.out.write("""
            <html><body>
            <form action="{0}" method="POST" enctype="multipart/form-data">
              Upload File: <input type="file" name="file"><br>
              <input type="submit" name="submit" value="Submit">
            </form>
            </body></html>""".format(uploadUrl))
        

class testUploadHandler(blobstore_handlers.BlobstoreUploadHandler):
    def post(self):
        
        logging.info("testUploadHandler called.")
        upload = self.get_uploads()[0]
        blob_key = upload.key()
        image_url = images.get_serving_url(blob_key)
        self.redirect(image_url) 

部署的代码在web服务器上返回如下错误(本地开发服务器没问题):

Traceback (most recent call last):
  File "/base/alloc/tmpfs/dynamic_runtimes/python27g/fdc6d631da52d25b/python27/python27_lib/versions/third_party/webapp2-2.5.2/webapp2.py", line 1535, in __call__
    rv = self.handle_exception(request, response, e)
  File "/base/alloc/tmpfs/dynamic_runtimes/python27g/fdc6d631da52d25b/python27/python27_lib/versions/third_party/webapp2-2.5.2/webapp2.py", line 1529, in __call__
    rv = self.router.dispatch(request, response)
  File "/base/alloc/tmpfs/dynamic_runtimes/python27g/fdc6d631da52d25b/python27/python27_lib/versions/third_party/webapp2-2.5.2/webapp2.py", line 1278, in default_dispatcher
    return route.handler_adapter(request, response)
  File "/base/alloc/tmpfs/dynamic_runtimes/python27g/fdc6d631da52d25b/python27/python27_lib/versions/third_party/webapp2-2.5.2/webapp2.py", line 1102, in __call__
    return handler.dispatch()
  File "/base/alloc/tmpfs/dynamic_runtimes/python27g/fdc6d631da52d25b/python27/python27_lib/versions/third_party/webapp2-2.5.2/webapp2.py", line 572, in dispatch
    return self.handle_exception(e, self.app.debug)
  File "/base/alloc/tmpfs/dynamic_runtimes/python27g/fdc6d631da52d25b/python27/python27_lib/versions/third_party/webapp2-2.5.2/webapp2.py", line 570, in dispatch
    return method(*args, **kwargs)
  File "/base/data/home/apps/s~puzzleflow-dev/20210325t013659.433969250928848570/puzzleflow.py", line 4171, in post
    image_url = images.get_serving_url(blob_key)
  File "/base/alloc/tmpfs/dynamic_runtimes/python27g/fdc6d631da52d25b/python27/python27_lib/versions/1/google/appengine/api/images/__init__.py", line 1866, in get_serving_url
    return rpc.get_result()
  File "/base/alloc/tmpfs/dynamic_runtimes/python27g/fdc6d631da52d25b/python27/python27_lib/versions/1/google/appengine/api/apiproxy_stub_map.py", line 615, in get_result
    return self.__get_result_hook(self)
  File "/base/alloc/tmpfs/dynamic_runtimes/python27g/fdc6d631da52d25b/python27/python27_lib/versions/1/google/appengine/api/images/__init__.py", line 1970, in get_serving_url_hook
    raise _ToImagesError(e, readable_blob_key)
TransformationError

另外,您可以访问此链接自行尝试(它应该是公开的):

https://puzzleflow-dev.appspot.com/testUpload

【问题讨论】:

  • 你的bucket的访问控制是什么?我测试了你的代码,它对我来说很好。唯一的区别是我使用了webapp2,并且我的存储桶是细粒度的。此外,我不建议将您的服务链接公开,因为您可能会突然收到请求高峰,这可能会影响您的计费。
  • 访问控制就是这样,谢谢。
  • 嗨,我看到您最近切换到“gcloud”,因为 appcfg(来自 GUI,GAE 启动器)已停用。我也遇到了同样的问题,因为我更喜欢 GUI 而不是命令行,所以我创建了一个 GUI 来替换 GAE Launcher。我不知道是否允许我直接在 cmets 中发布指向我自己网站的链接,但您可以在我的个人资料中找到指向该网站的链接。如果愿意,请随意尝试并提供一些反馈。干杯

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


【解决方案1】:

问题是我已将访问控制切换到统一,因为 Google 说这是“推荐”设置。我对 Fine-Grained 和 Uniform 之间的区别不够精通,但是将其切换回 Fine-Grained 解决了这个问题。

【讨论】:

    猜你喜欢
    • 2016-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-07
    • 2021-09-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多