无法直接从 URL 将文件上传到 Google Cloud Storage。由于您是从本地环境运行脚本,因此要上传的文件内容需要位于同一环境中。这意味着 url 的内容需要存储在内存中或文件中。
基于您的代码显示如何执行此操作的示例:
Option 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)
Option 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)