将其中带有问号的GCS存储桶Blob下载到文件中

时间:2019-10-04 09:49:47

标签: google-cloud-platform google-cloud-storage

我遇到一个奇怪的错误,我怀疑是由文件中的问号引起的。我对URI做了一些修改,但是您知道了。

这有效: gsutil cp gs://bucket-id/209146000/showphoto.aspx?photoid=12345.jpg test.jpg

但这是

client.download_blob_to_file('gs://bucket-id/209146000/showphoto.aspx?photoid=12345.jpg', open('test.jpg', 'wb'))

给我一​​个错误:

NotFound: 404 GET https://www.googleapis.com/download/storage/v1/b/marine-scrape/o/209146000%2Fshowphoto.aspx?alt=media: ('Request failed with status code', 404, 'Expected one of', <HTTPStatus.OK: 200>, <HTTPStatus.PARTIAL_CONTENT: 206>)

如何避免这种情况?我可能不应该使用?首先在文件名中标记,但是就在这里。我尝试转义\?,但不起作用。有什么想法吗?

3 个答案:

答案 0 :(得分:3)

我的回答有两种解决方法。

使用问题文件名重命名对象

  1. 登录到Google Cloud Console。
  2. 转到存储空间。
  3. 选择包含文件的存储桶。
  4. 选择包含对象的文件夹。
  5. 对象的最右侧是椭圆菜单。
  6. 单击此菜单,然后选择“重命名”。
  7. 重命名对象。

更改代码

我查看了库google.cloud.storage 1.20.0版的源代码。当第一个参数是字符串时,函数download_blob_to_file()不支持URL编码。它确实适用于blob对象。我提供了两种支持您文件名的方法。

方法1:

import  sys
import urllib.parse

# Imports the Google Cloud client library
from google.cloud import storage

bucket_name = 'bucket-id'
object_name = '209146000/showphoto.aspx?photoid=12345.jpg'
outfile = 'test.jpg'

client = storage.Client()

bucket = client.get_bucket(bucket_name)

blob = storage.Blob(object_name, bucket)

client.download_blob_to_file(blob, open('test.jpg', 'wb'))

方法2:

import  sys
from google.cloud import storage

bucket_name = 'bucket-id'
object_name = '209146000/showphoto.aspx?photoid=12345.jpg'
outfile = 'test.jpg'

client = storage.Client()

bucket = client.get_bucket(bucket_name)

blob = bucket.blob(object_name)

blob.download_to_filename(outfile)

答案 1 :(得分:1)

如果您查看此Bucket and object naming guidelines,将会发现必须避免使用特殊字符,例如“ [”,“]”,“ *”或“?”在您的对象名称中。

为避免这种情况,在命名存储桶或对象时,请勿使用特殊字符。

从这里您可以重命名文件

答案 2 :(得分:0)

GCS对象名称中允许使用这些字符; gsutil将它们解释为通配符,从而阻止您下载对象。

重命名以便您不使用这些字符将使gsutil不会遇到这个问题,但是如果不可能,则可以使用其他工具下载该对象(例如wget)。有一个针对gsutil的长期开放bug支持一种原始模式来解决此问题,但该错误仍处于打开状态。