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

如何将从Amazon S3获取的对象写入文件?含加密场景还原方案

如何将AWS S3加密对象写入本地文件还原原始MP3?

问题背景

我正在尝试将数据加密后上传至Amazon S3,下面是我修改后的Ruby示例代码,用于加密并上传MP3文件:

require 'openssl'
key = OpenSSL::PKey::RSA.new(1024)
# encryption client
s3 = Aws::S3::Encryption::Client.new(encryption_key: key)
# round-trip an object, encrypted/decrypted locally
s3.put_object(bucket:'aws-sdk', key:'secret', body: open('song.mp3'))
s3.get_object(bucket:'aws-sdk', key:'secret').body.read

我有两个疑问:

  • 怎么把从S3获取到的对象写入本地文件?
  • 在这个加密上传的场景下,如何通过get_object写入文件来还原原始的MP3?

解决方案

1. 基础操作:将S3对象写入本地文件

不管对象是否加密,你都可以通过Ruby的文件API完成写入操作。这里有两种常用方式:

方式一:一次性写入(适合小文件)

直接读取对象内容后写入文件:

# 获取S3对象响应
response = s3.get_object(bucket:'aws-sdk', key:'secret')
# 将内容写入本地文件
File.write('downloaded_song.mp3', response.body.read)
方式二:流式写入(适合大文件)

如果你的MP3文件比较大,推荐用流的方式逐块写入,避免一次性把整个文件加载到内存:

File.open('downloaded_song.mp3', 'wb') do |local_file|
  s3.get_object(bucket:'aws-sdk', key:'secret') do |chunk|
    local_file.write(chunk)
  end
end

2. 加密场景下还原原始MP3

好消息是,你使用的Aws::S3::Encryption::Client已经帮你处理了解密逻辑!当你调用get_object时,客户端会自动用你传入的encryption_key解密内容,所以上面的代码直接就能还原出原始的MP3文件,不需要额外做解密操作。

这里有个关键注意点:解密时必须使用和上传时完全相同的密钥。实际生产环境中,不要每次都生成新的RSA密钥(像示例里那样OpenSSL::PKey::RSA.new(1024)),你需要保存好上传时用的密钥,后续解密时加载这个密钥即可。

结合你的场景,完整的还原代码示例如下:

require 'openssl'
require 'aws-sdk-s3'

# 加载上传时使用的密钥(实际场景中从安全存储读取,不要硬编码)
key = OpenSSL::PKey::RSA.new(File.read('upload_key.pem'))
s3 = Aws::S3::Encryption::Client.new(encryption_key: key)

# 下载、解密并写入本地文件
File.open('restored_song.mp3', 'wb') do |local_file|
  s3.get_object(bucket:'aws-sdk', key:'secret') do |chunk|
    local_file.write(chunk)
  end
end

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:24:34