我遇到一个奇怪的错误,我怀疑是由文件中的问号引起的。我对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>)
如何避免这种情况?我可能不应该使用?首先在文件名中标记,但是就在这里。我尝试转义\?
,但不起作用。有什么想法吗?
答案 0 :(得分:3)
我的回答有两种解决方法。
使用问题文件名重命名对象
更改代码
我查看了库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支持一种原始模式来解决此问题,但该错误仍处于打开状态。