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

在Rails中免临时文件实现PDF下载并上传至Amazon S3可行吗?

可以直接上传,无需临时文件!

当然没问题,完全不需要创建本地临时文件,直接把RestClient返回的response.body作为PDF内容上传到Amazon S3即可。下面是具体的实现方案:

前提准备

首先确保你已经安装并配置了AWS SDK for Ruby(aws-sdk-s3),并且AWS凭证已正确配置(比如通过环境变量、~/.aws/credentials文件,或者在AWS托管服务上使用IAM角色)。

完整代码示例

结合你现有的RestClient请求,修改成直接上传的版本:

require 'aws-sdk-s3'
require 'rest-client'

# 初始化S3客户端(替换成你的AWS区域,比如us-east-1)
s3_client = Aws::S3::Client.new(region: 'your-region')

RestClient::Request.execute(
  method: :get,
  url: "#{@url}/test/#{id}/pdf",
  headers: json_headers.merge(jwt_headers(access_token))
) do |response|
  disconnect if response.code == 401
  next unless response.code == 200

  # 直接将response.body上传到S3
  s3_client.put_object(
    bucket: 'your-target-bucket', # 替换成你的存储桶名称
    key: "documents/test-#{id}.pdf", # 替换成你想要的S3对象路径/文件名
    body: response.body,
    content_type: 'application/pdf' # 可选:明确指定文件类型,帮助S3识别
  )
end

优化:大文件流式上传

如果你的PDF文件体积较大,一次性把response.body加载到内存可能会占用过多资源。这种情况下,可以使用response.raw_body获取IO流,实现边下载边上传的流式处理,大幅降低内存消耗:

# 大文件场景下的流式上传
s3_client.put_object(
  bucket: 'your-target-bucket',
  key: "documents/test-#{id}.pdf",
  body: response.raw_body, # 使用IO流替代完整内存加载
  content_type: 'application/pdf'
)

关键注意事项

  • 确保你的AWS身份拥有S3:PutObject权限,否则会出现权限错误。
  • 若RestClient返回的response.body是编码后的字符串(比如UTF-8),可以先确认它的二进制正确性——不过PDF作为二进制文件,RestClient默认会以二进制形式返回response.body,一般无需额外处理。
  • 加上content_type: 'application/pdf'参数可以让S3正确标记文件类型,后续访问时浏览器会直接识别为PDF而非下载未知文件。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:09:28