Python 将文件从URL传输到云存储

Python 将文件从URL传输到云存储,python,google-cloud-platform,google-cloud-storage,google-cloud-functions,Python,Google Cloud Platform,Google Cloud Storage,Google Cloud Functions,我是一名Ruby开发人员,正在尝试用Python编写Google云函数,并且在将远程文件从给定URL传输到Google云存储(GCS)时遇到了麻烦 在一个等效的RoR应用程序中,我下载到应用程序的临时存储,然后上传到GSC 我希望有一种方法可以简单地通过云功能将远程文件“下载”到我的GCS存储桶中 下面是一个简单的例子,说明了我对一些注释所做的操作,真正的代码从私有API获取URL,但这很好,并不是问题所在 from google.cloud import storage project_id

我是一名Ruby开发人员,正在尝试用Python编写Google云函数,并且在将远程文件从给定URL传输到Google云存储(GCS)时遇到了麻烦

在一个等效的RoR应用程序中,我下载到应用程序的临时存储,然后上传到GSC

我希望有一种方法可以简单地通过云功能将远程文件“下载”到我的GCS存储桶中

下面是一个简单的例子,说明了我对一些注释所做的操作,真正的代码从私有API获取URL,但这很好,并不是问题所在

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)

提前感谢。

无法直接从URL将文件上载到Google云存储。由于您是在本地环境中运行脚本,因此要上载的文件内容需要位于同一环境中。这意味着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
模块类似,但不是写入文件,而是写入变量。请注意,如果您计划在Python2.X中运行脚本,我在Python3中完成了这个示例

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)

无法直接从URL将文件上载到Google云存储。由于您是在本地环境中运行脚本,因此要上载的文件内容需要位于同一环境中。这意味着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
模块类似,但不是写入文件,而是写入变量。请注意,如果您计划在Python2.X中运行脚本,我在Python3中完成了这个示例

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)

通过该服务可以直接将URL传输到GCS,但为单个URL设置云传输作业会带来大量开销。这种解决方案针对的是数百万个URL需要成为GCS对象的情况


相反,我建议编写一个作业,将从读取URL到写入流的传入流泵送到GCS,并在靠近bucket的Google云中的某个地方运行该作业。

通过该服务可以直接将URL传输到GCS,但为单个URL设置云传输作业的开销很大。这种解决方案针对的是数百万个URL需要成为GCS对象的情况


相反,我建议编写一个作业,将从读取URL到写入流的输入流泵送到GCS,并在谷歌云中靠近存储桶的某个地方运行。

谢谢,@Joan Grau。我升级到Python3,并选择了选项2,因为我正在做一些类似的工作。它在本地运行得很好,我现在只需要在谷歌云上测试和部署。谢谢@Joan。“选项2在谷歌云上对我非常有效。谢谢你,@Joan Grau。我升级到Python3,并选择了选项2,因为我正在做一些类似的工作。它在本地运行得很好,我现在只需要在谷歌云上测试和部署。谢谢@Joan。选项2在谷歌云上对我来说非常有效。