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

