You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Ruby将远程URL文件上传至Google Cloud Storage存储桶

Ruby实现公共URL文件上传至Google Cloud Storage方案

GCS本身没有提供直接传入公共URL就自动拉取文件到存储桶的原生接口,通用实现是流式拉取远程文件+流式上传GCS,全程不需要把文件落到本地磁盘,内存占用低,大小文件都适用。

前置准备

  • 安装依赖gem:
    执行命令安装官方GCS SDK和流式HTTP拉取工具:
    gem install google-cloud-storage down
    如果用Bundler管理依赖,在Gemfile中添加以下内容后执行bundle install即可:
    gem "google-cloud-storage"
    gem "down"
    
  • 配置鉴权:
    提前准备好有目标存储桶写入权限(storage.objects.create权限)的GCS服务账号密钥,将密钥文件路径配置到系统环境变量GOOGLE_APPLICATION_CREDENTIALS中,SDK会自动加载鉴权信息,不需要硬编码密钥。

实现代码

以下代码全程用流处理,不会把整个文件加载到内存,支持GB级大文件上传:

require "google/cloud/storage"
require "down"

# 初始化GCS客户端
storage = Google::Cloud::Storage.new
# 替换为你的目标存储桶名称
bucket = storage.bucket "your-gcs-bucket-name"
# 替换为要拉取的公共文件URL
remote_file_url = "待拉取的公共文件完整访问链接"
# 替换为文件上传到GCS后保存的对象路径
gcs_object_path = "uploaded/files/from-remote/custom-filename.pdf"

begin
  # 流式拉取远程文件,支持自动跟随重定向、超时配置
  remote_stream = Down.open(
    remote_file_url,
    follow_redirects: 5,
    timeout: { connect: 10, read: 30 }
  )

  # 直接把流传给GCS上传接口,全程不落盘
  bucket.create_file(
    remote_stream,
    gcs_object_path,
    # 可选:配置文件content_type,不填SDK会自动尝试识别
    content_type: remote_stream.data[:content_type]
  )

  puts "文件上传成功,GCS对象路径:#{gcs_object_path}"
rescue Down::NotFound, Down::ClientError, Down::TimeoutError => e
  puts "拉取远程文件失败:#{e.message}"
rescue Google::Cloud::Error => e
  puts "上传GCS失败:#{e.message}"
ensure
  # 关闭拉流连接释放资源
  remote_stream&.close
end

注意事项

  • 大文件适配:如果单文件大小超过100MB,可以在create_file方法中添加chunk_size: 5.megabytes参数,开启分块上传,进一步降低内存峰值。
  • 防盗链处理:如果源站做了Referer防盗链、UA校验,可以在Down.open的参数中添加自定义headers模拟正常浏览器请求,绕过防盗链限制。
  • 文件名处理:不要直接截取URL路径作为GCS对象名,公网URL经常带query参数、特殊编码字符,很容易生成不符合GCS命名规范的对象键,建议自定义上传后的对象路径。
  • 网络连通性:确保运行代码的服务器可以正常访问目标公网URL,同时能连通GCS的API端点,避免出网规则拦截导致流程失败。

如果你的文件源固定是其他云存储服务、或者需要批量拉取大量公网文件,可以用GCS的Storage Transfer Service配置拉取任务,不需要自己写代码维护上传逻辑,但单文件/零散公网URL上传用上面的流式方案最灵活。

内容的提问来源于stack exchange,提问作者sagar verma

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 15:06:21