当前位置: 首页 > 面试题库 >

将文件从URL传输到Cloud Storage

锺离德庸
2023-03-14
问题内容

我是一名Ruby开发人员,尝试使用Python编写的Google Cloud Functions,并且将远程文件从给定的URL传输到Google Cloud
Storage(GCS)遇到了麻烦。

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

我希望有一种方法可以通过Cloud Function将远程文件简单地“下载”到我的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 Cloud
Storage。由于您是从本地环境运行脚本,因此要上载的文件内容必须在同一环境中。这意味着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上做了这个示例,如果您打算在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)


 类似资料:
  • 问题内容: 如何将URL输出的JSON保存到文件中? 例如,来自Twitter搜索API(此http://search.twitter.com/search.json?q=hi) 语言并不重要。 编辑//然后如何将进一步的更新附加到EOF? 编辑2 //确实,答案很好,但是我接受了我认为最优雅的答案。 问题答案: 这在任何语言中都很容易,但是机制各不相同。使用wget和shell: 追加: 使用P

  • 我需要帮助使用Firebase函数将大型JSON文件从Firebase存储流到Firestore。 我想将几个大的换行JSON文件(11x700MB)传输到FireStore。我正在尝试从Firebase存储加载它们,对文件进行流式处理,并将内容写入Firestore集合。 我现在不知道该怎么做,但我很感激你的帮助。

  • 问题内容: 好吧,这看起来很简单,确实如此。将文件下载到服务器所需要做的就是: 只有一个问题。如果文件很大,例如100mb,该怎么办?然后,您将耗尽内存,并且无法下载文件。 我想要的是一种在下载文件时将文件写入磁盘的方法。这样,我可以下载更大的文件,而不会遇到内存问题。 问题答案: 从PHP 5.1.0开始,支持通过传递流句柄作为参数来逐段编写: 从手册中: 如果 数据 [是第二个参数]是流资源,

  • 问题内容: 我正在寻找一种将文件中的音频数据馈送到麦克风的方法,因此,当第三方应用程序(例如 arecord 或Chromium的“按语音搜索”功能)使用麦克风进行音频输入时,它们会从文件中接收音频数据代替。 这是我的情况 :我编写的一个应用程序记录了来自麦克风的音频数据(使用ALSA)并将其保存到文件(audioFile0.raw)中。在将来的某个未知时间点,某些未知的第三方应用程序(例如,我没

  • 在我的Java应用程序中,我使用的是一个文本文件(大小为300MB),它保存在HDFS中。文件的每一行都包含一个字符串和一个用逗号分隔的整数ID。我正在逐行读取文件,并从中创建Hashmaps(String,ID)。 文件如下所示: 现在,我当前正在直接使用Apacha Hadoop配置和FileSystem对象从HDFS读取文件。 输入流“in”被传递给另一个名为read(InputStream

  • FileZilla在尝试通过SFTP模式连接到AWS实例时抛出错误。实例运行在Ubuntu 13.10上。 连接参数: