Невозможно загрузить файл в Google Cloud Storage напрямую с URL-адреса.Поскольку вы запускаете скрипт из локальной среды, содержимое файла, которое вы хотите загрузить, должно находиться в той же среде.Это означает, что содержимое URL-адреса должно быть сохранено в памяти или в файле.
Пример, показывающий, как это сделать, на основе вашего кода:
Опция 1 : Вы можете использовать модуль wget
, который будет извлекать URL-адрес и загружатьэто содержимое в локальном файле (аналогично команде wget
CLI).Обратите внимание, что это означает, что файл будет сохранен локально, а затем загружен из файла.Я добавил строку os.remove
, чтобы удалить файл после завершения загрузки.
from google.cloud import storage
import wget
import io, os
project_id = 'my-project'
bucket_name = 'my-bucket'
destination_blob_name = 'upload.test'
storage_client = storage.Client.from_service_account_json('my_creds.json')
source_file_name = 'http://www.hospiceofmontezuma.org/wp-content/uploads/2017/10/confused-man.jpg'
def upload_blob(bucket_name, source_file_name, destination_blob_name):
filename = wget.download(source_file_name)
bucket = storage_client.get_bucket(bucket_name)
blob = bucket.blob(destination_blob_name)
blob.upload_from_filename(filename, content_type='image/jpg')
os.remove(filename)
upload_blob(bucket_name, source_file_name, destination_blob_name)
Опция 2 : при использовании модуля urllib
работает аналогично модулю wget
, но вместо записи в файл он записывает в переменную.Обратите внимание, что я сделал этот пример в Python3, есть некоторые различия , если вы планируете запустить свой скрипт в Python 2.X.
from google.cloud import storage
import urllib.request
project_id = 'my-project'
bucket_name = 'my-bucket'
destination_blob_name = 'upload.test'
storage_client = storage.Client.from_service_account_json('my_creds.json')
source_file_name = 'http://www.hospiceofmontezuma.org/wp-content/uploads/2017/10/confused-man.jpg'
def upload_blob(bucket_name, source_file_name, destination_blob_name):
file = urllib.request.urlopen(source_file_name)
bucket = storage_client.get_bucket(bucket_name)
blob = bucket.blob(destination_blob_name)
blob.upload_from_string(link.read(), content_type='image/jpg')
upload_blob(bucket_name, source_file_name, destination_blob_name)