在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
相关产品推荐
相关产品推荐

