谷歌云存储 - 从网络下载文件

Posted

技术标签:

【中文标题】谷歌云存储 - 从网络下载文件【英文标题】:Google cloud storage - Download file from web 【发布时间】:2015-04-29 06:01:52 【问题描述】:

我想在我的下一个项目中使用 Google 云存储。 我的目标是跟踪各种网站并收集一些照片。因为,我阅读了 gsutil 的文档;我可以手动将文件下载到我的服务器并使用 gsutil 将其上传到谷歌云存储。

下载和上传文件会在我的服务器中产生大量流量。 有没有办法让谷歌云直接从http下载文件?

【问题讨论】:

【参考方案1】:

主要答案

这在 Google Cloud Shell 中很容易做到。似乎适用于所有文件大小:

 curl http://speedtest.tele2.net/10GB.zip | gsutil cp - gs://YOUR_BUCKET_NAME/10GB.zip

基本上 curl 将数据直接流式传输到存储桶。

替代(文件小于 ~ 4.6 GB)

原始方法:只要您的下载小于 ~ 4.6 GB,此方法就可以使用。启动 Cloud Shell(在 GCP 中登录项目后右上角的第一个图标)并使用 wget 下载所需的文件。例如,下载 7-Zip 类型:

wget https://www.7-zip.org/a/7z1805-x64.exe

现在有了 Cloud Shell 用户主页中的文件,您可以使用 gsutil 命令将其复制到 Google Cloud Storage 存储分区:

gsutil cp ./7z1805-x64.exe gs://your_bucket_name/

替代方案(大于 ~ 4.6 GB)

如果文件大于 4.6 GB,您仍然可以这样做,但您需要使用 gcsfuse 在 Cloud Shell 中挂载存储桶:

在您的 Cloud Shell 用户主目录中创建一个目录

 mkdir ~/mybucket

现在使用 gcsfuse 将存储桶挂载到该目录中:

 gcsfuse bucket_name ~/mybucket

改变当前目录为挂载点目录:

 cd mybucket

(如果您想玩得开心,请运行“df -h.”以查看您在该挂载点获得了多少空间)

现在使用 wget 将文件直接获取到您的存储桶中(示例使用 10GB 的网络文件):

 wget https://speed.hetzner.de/10GB.bin

【讨论】:

【参考方案2】:

Google Cloud Storage 仅直接接受数据。无法将 URL 传递给它并让它将内容保存为对象。

但是,您没有理由不能自己构建此功能。例如,您可以设置一个或多个专用 GCE 实例来加载 URL,然后将它们保存到 GCS。 Google 也不会对区域内的网络进入 GCE 或从 GCE 进入 GCS 收费,这很有帮助。

【讨论】:

【参考方案3】:

Google Cloud Storage 提供JSON API。您可以在应用程序中直接向 JSON API 发出 HTTP 请求,这会将文件上传和下载流量直接引导到 Google Cloud Storage。

要从公共 Google Cloud Storage 存储桶下载文件,请向 https://www.googleapis.com/storage/v1/b/<bucket>/o/<object> 发出 GET 请求,其中 <bucket> 是您的 Google Cloud Storage 存储桶的名称,<object> 是存储桶中文件的名称.这应该可以在没有任何身份验证的情况下工作,但我自己没有尝试过。您可以阅读此 API 请求的文档here。

要将文件上传到公共存储桶,有多种选择。简单的方法是向https://www.googleapis.com/upload/storage/v1/b/<bucket>/o 发出 POST 请求,其中<bucket> 是您的公共存储桶的名称。这种方法最适合小于 5 MB 的小文件。您可以阅读此 API 请求的文档here。较大的上传将需要不同的方法,概述here。同样,我自己没有尝试过这种方法,但它应该可以在没有身份验证的情况下工作。

如果您需要执行经过身份验证的上传和下载,事情会变得有点复杂。 Google Cloud Storage 支持使用签名 URL 进行上传和下载。这些 URL 描述了 Google Cloud Storage 上的特定操作,例如上传或下载,并带有时间敏感签名。任何拥有该 URL 的人都可以在 Google Cloud Storage 上执行指定的操作。它们可以安全地从服务器传递到客户端。您可以在应用程序的后端生成签名 URL 并将其传递给前端。然后前端可以使用 URL 直接上传到 Google Cloud Storage。有关签名 URL 的更多信息here。

最后,如果您需要限制上传,例如最大文件大小,您需要使用签名的策略文档,描述为here。这与签名 URL 类似,因为它是应由应用程序后端生成的 URL,并包含对时间敏感的签名。策略文档采用 Base64 编码并包含在生成的 URL 中。它描述了上传的限制。 URL 签名包含策略文档,以便 Google Cloud Storage 知道将该特定策略应用于该 URL 的上传请求。

资料来源:我和我的团队正在构建一个托管在 Google Cloud Platform 上的全栈应用程序,该应用程序使用 Google Cloud Storage 进行上传和下载。我们正在使用签名的政策文件进行上传。

【讨论】:

以上是关于谷歌云存储 - 从网络下载文件的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 gsutil 通过 http 链接从谷歌云存储下载到 AWS 实例或 s3 存储桶?

谷歌云功能下载文件并重定向到桶存储

谷歌云存储报告下载无法访问

谷歌云存储:我如何避免边缘缓存

从谷歌云存储下载 excel 文件返回一个缓冲区,我怎样才能返回实际的 excel 文件,以便我可以在我的处理程序中写入它?

如何从谷歌云平台下载 WordPress 文件