从云传输到Storag的URL

2024-04-25 09:25:35 发布

您现在位置:Python中文网/ 问答频道 /正文

我是一个Ruby开发人员,正在尝试用Python编写的Google云函数,但在将一个来自给定URL的远程文件传输到googlecloudstorage(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)

提前谢谢。在


Tags: 函数namefrom应用程序urlsource远程bucket
2条回答

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

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

不可能直接从URL上传文件到Google云存储。由于您是从本地环境运行脚本,所以要上载的文件内容必须位于同一环境中。这意味着url的内容需要存储在内存中,或者存储在文件中。在

一个基于您的代码演示如何执行此操作的示例:

选项1:您可以使用wget模块,该模块将获取url并将其内容下载到本地文件中(类似于wgetCLI命令)。请注意,这意味着该文件将存储在本地,然后从该文件上载。我添加了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中做了这个示例,there are some differences如果您计划在python2.X中运行脚本

^{pr2}$

相关问题 更多 >