【问题标题】:Download GCS bucket blob with a question mark in it to file将带有问号的 GCS 存储桶 blob 下载到文件中
【发布时间】:2019-10-04 09:49:47
【问题描述】:

我遇到了一个奇怪的错误,我怀疑这是由我的文件中的问号引起的。我对 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>)

如何避免这种情况?我可能不应该使用 ?首先标记文件名,但我们在这里。我试过逃避它\?,但它不起作用。有什么想法吗?

【问题讨论】:

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


    【解决方案1】:

    我的答案有两种解决方案。

    用问题文件名重命名对象

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

    更改代码

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

    方法一:

    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'))
    

    方法二:

    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)
    

    【讨论】:

    • 尝试了你的第二个建议,不幸的是,使用 Python 3.7 得到了同样的错误 @Gerard。但也许有人有不同的结果?
    • 更新:使用 Python 2.7 时同样的问题。
    • @Maxim - 我用我测试过的 Python 3 代码更新了我的答案。
    • 谢谢,没有尝试过代码,但我很欣赏周围的工作。我个人最终以编程方式重命名它们的方法是使用 ipython 为每个带有问号的文件发出 gsutil mv 命令。
    【解决方案2】:

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

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

    从这里你可以重命名你的文件

    【讨论】:

    • 你说的从这里到底是什么意思?
    • 从这里=根据你的实际情况
    【解决方案3】:

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

    重命名以便您不使用这些字符会使 gsutil 对您没有这个问题,但如果这不可能,您可以使用其他工具来下载对象(例如 wget)。有一个长期开放的bug 反对 gsutil 以支持原始模式来解决此问题,但该错误仍然存​​在。

    【讨论】:

      猜你喜欢
      • 2020-09-17
      • 2022-11-24
      • 1970-01-01
      • 2022-06-29
      • 1970-01-01
      • 2021-06-13
      • 2019-02-16
      • 2020-01-24
      • 2020-05-06
      相关资源
      最近更新 更多