如何使用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
相关产品推荐
相关产品推荐

