【问题标题】:TransformationError Reasons get_serving_url / Images APITransformationError 原因 get_serving_url / Images API
【发布时间】:2026-01-14 06:00:01
【问题描述】:

我在使用 get_serving_url 来提供存储桶中的图像时遇到了以下错误。

Traceback (most recent call last):
 File "/base/data/home/runtimes/python27/python27_lib/versions/third_party/webapp2-2.5.2/webapp2.py", line 570, in dispatch
   return method(*args, **kwargs)
 File "/base/data/home/runtimes/python27/python27_lib/versions/1/google/appengine/ext/ndb/tasklets.py", line 1087, in synctasklet_wrapper
   return taskletfunc(*args, **kwds).get_result()
 File "/base/data/home/runtimes/python27/python27_lib/versions/1/google/appengine/ext/ndb/tasklets.py", line 1057, in tasklet_wrapper
   result = func(*args, **kwds)
 File "/base/data/home/apps/e~tileserve20171207t210519.406056180994857717/blob_upload.py", line 70, in post
   bf.put_async()
 File "/base/data/home/runtimes/python27/python27_lib/versions/1/google/appengine/ext/ndb/model.py", line 3473, in _put_async
   self._pre_put_hook()
 File "/base/data/home/apps/e~tileserve/20171207t210519.406056180994857717/blob_files.py", line 124, in _pre_put_hook
   print images.get_serving_url(None, filename='/gs' + '/tileserve.appspot.com/user2test4test4RGB20170927.tif')
 File "/base/data/home/runtimes/python27/python27_lib/versions/1/google/appengine/api/images/__init__.py", line 1868, in get_serving_url
   return rpc.get_result()
 File "/base/data/home/runtimes/python27/python27_lib/versions/1/google/appengine/api/apiproxy_stub_map.py", line 613, in get_result
   return self.__get_result_hook(self)
 File "/base/data/home/runtimes/python27/python27_lib/versions/1/google/appengine/api/images/__init__.py", line 1972, in get_serving_url_hook
   raise _ToImagesError(e, readable_blob_key)
 TransformationError

当我将图像上传到我的存储桶时,它可以工作,但是当我通过处理创建应该通过 get_serving_url 公开的图像时,我得到 TransformationError。

我尝试了两种提供图片的变体:

test = blobstore.create_gs_key('/gs' + '/path2object')
images.get_serving_url(test, secure_url=True)

images.get_serving_url(None, filename='/gs' + '/' + <bucket name>+  '/'+ <object name>)

我还设置了存储桶对象 ACM 权限和 IAM App Engine 应用默认服务帐户权限(存储管理员)。这两种变体都没有改变,但对于访问存储桶的对象很重要。

有人遇到过这个问题吗?可能是什么错误?我不明白为什么它在我上传图像时有效,但不适用于通过处理生成的图像。

【问题讨论】:

  • 通常 TransformationError 由图像 API 返回。你能显示完整的回溯吗?
  • 嗨..是的,我知道,但我没有找到解决方案以及此错误的原因。我将完整的回溯添加到我的问题
  • 你能显示blobstore.create_gs_key之前的代码,它将转换后的图像保存在GCS中吗?
  • 我正在使用地球引擎处理卫星图像..地球引擎提供了一个具有 export2cloudstorage 功能的 API。我无法设置标题。你认为这可能是问题吗?我考虑过实现一个函数,该函数读取存储桶中的内容并使用诸如 options={b'x-goog-acl': b'public-read', b'cache-control': b'private 之类的标头将其写回, max-age=0, no-cache'})
  • 非常感谢您的帮助

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


【解决方案1】:

回溯表明您可能正在尝试调用images.get_serving_url(),而异步操作可能仍在进行中。

如果该操作实际上将转换后的图像保存在 GCS 中,那么它可以解释失败:get_serving_url() 包括对文件是否为有效图像的检查,如果文件尚未保存,则会失败并显示TransformationError

如果是这样 - 您可以通过以下任一方式解决问题:

  • 切换到保存图片的同步版本
  • 等待图像保存完成(以防您在此期间还有其他事情要做)- 在调用 get_serving_url() 之前获取同步调用的结果
  • 反复尝试get_serving_url(),同时捕捉TransformationError,直到它不再以这种方式失败。这有点冒险,因为如果引发TransformationError 的原因不是简单地保存不完整的图像,它可能会陷入无限循环。

【讨论】:

  • 是的,您是对的,检查文件会导致错误...这很奇怪,因为所有图像都写入 gcs 并准备好提供服务...也许是什么问题生成的图像格式...您知道通过 get_serving_url 公开 gcs 内容的工作示例吗?所有示例均基于先上传。这已经适用于我的情况
  • 确保在调用get_serving_url()之前实际保存了转换后的文件。
  • @DanCornilescu 在同步模式下写入的标志是什么?我的模式是 write_retry_params = gcs.RetryParams(backoff_factor=1.1) gcs_file = gcs.open(filename, 'w', content_type='image/%s' % file_type, options={'x-goog-meta-user': identifier }, retry_params=write_retry_params) gcs_file.write(content) gcs_file.close() bkey = blobstore.create_gs_key('/gs%s' % 文件名) url = images.get_serving_url(bkey, secure_url=True)
  • @user1961。这不是一个标志,而是正在进行的 API 调用。在原始帖子中,它可能类似于bf.put() 而不是bf.put_async()。你的写是同步的。
  • @DanCornilescu 也许在我的情况下有所不同。我没有写入数据存储区,而是通过“gcs_file.write(content) 和 gcs_file.close()”写入 GCS 中的存储桶,其中内容是图像二进制文件。它的工作很随意,所以我认为这将是一个同步问题。但我认为 GCS 的 file.write() 是同步的。感谢您的时间和关注。
最近更新 更多