Перенос файла с URL в облачное хранилище - PullRequest
0 голосов
/ 17 января 2019

Я разработчик Ruby и пробую свои силы в облачных функциях Google, написанных на Python, и столкнулся с проблемой передачи удаленного файла с указанного URL-адреса в Google Cloud Storage (GCS).

В эквивалентном приложении RoR я загружаю в эфемерное хранилище приложения и затем загружаю в GSC.

Я надеюсь, что есть способ просто «загрузить» удаленный файл в мое хранилище GCS через облачную функцию.

Вот упрощенный пример того, что я делаю с некоторыми комментариями, реальный код выбирает URL-адреса из частного API, но это прекрасно работает, и проблема не в этом.

from google.cloud import storage
project_id = 'my-project'
bucket_name = 'my-bucket'
destination_blob_name = 'upload.test'
storage_client = storage.Client.from_service_account_json('my_creds.json')

# This works fine
#source_file_name = 'localfile.txt'

# When using a remote URL I get 'IOError: [Errno 2] No such file or directory'
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):
    bucket = storage_client.get_bucket(bucket_name)
    blob = bucket.blob(destination_blob_name)
    blob.upload_from_filename(source_file_name)

upload_blob(bucket_name, source_file_name, destination_blob_name)

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 17 января 2019

Прямая передача URL-адресов в GCS возможна с помощью службы Cloud Transfer , но настройка задания облачной передачи для одного URL-адреса требует больших затрат. Такое решение предназначено для ситуации с миллионами URL-адресов, которые должны стать объектами GCS.

Вместо этого я рекомендую написать задание, которое качает входящий поток из чтения URL-адреса в поток записи в GCS и запускает его где-то в облаке Google рядом с корзиной.

0 голосов
/ 17 января 2019

Невозможно загрузить файл в 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...