Загрузите ведро блоб GCS с вопросительным знаком в нем в файл - PullRequest
2 голосов
/ 04 октября 2019

Я столкнулся со странной ошибкой, которая, как я подозреваю, вызвана вопросительным знаком в моем файле. Я немного отредактировал 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 ]

3 голосов
/ 04 октября 2019

Мой ответ имеет два решения.

Переименуйте объект с именем файла проблемы

  1. Войдите в консоль Google Cloud.
  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 голос
/ 04 октября 2019

Если вы ознакомитесь с этими Правилами именования контейнеров и объектов , вы обнаружите, что вам следует избегать использования специальных символов, таких как "[", "]", "*" или "?"в именах ваших объектов.

Чтобы избежать этого, просто не используйте специальные символы при именовании ваших контейнеров или объектов.

Отсюда вы можете просто переименовать ваши файлы

0 голосов
/ 04 октября 2019

Эти символы разрешены в именах объектов GCS;именно gsutil интерпретирует их как символы подстановки и, таким образом, не позволяет вам загрузить объект.

Переименование, чтобы вы не использовали эти символы, сделало бы так, чтобы у gsutil не было этой проблемы для вас, но еслиэто не возможно, вы можете использовать другой инструмент для загрузки объекта (например, wget). Для gsutil существует давно открытая ошибка для поддержки необработанного режима для решения этой проблемы, но ошибка все еще открыта.

...