我有这个代码,它将一个zip文件写入磁盘,将其读回,上传到s3,然后删除该文件:
compressed_file = some_temp_path
Zip::ZipOutputStream.open(compressed_file) do |zos|
some_file_list.each do |file|
zos.put_next_entry(file.some_title)
zos.print IO.read(file.path)
end
end # Write zip file
s3 = Aws::S3.new(S3_KEY, S3_SECRET)
bucket = Aws::S3::Bucket.create(s3, S3_BUCKET)
bucket.put("#{BUCKET_PATH}/archive.zip", IO.read(compressed_file), {}, 'authenticated-read')
File.delete(compressed_file)
此代码已经运行,但我想要的是不再创建zip文件,以节省一些步骤。我想知道是否有办法将zipfile数据直接导出到s3而不必先创建一个tmp文件,读回来然后删除它?
答案 0 :(得分:9)
我想我刚刚找到了问题的答案。
这是Zip::ZipOutputStream.write_buffer。我会检查一下,并在我开始工作时更新这个答案。
<强>更新强>
确实有效。我的代码现在是这样的:
compressed_filestream = Zip::ZipOutputStream.write_buffer do |zos|
some_file_list.each do |file|
zos.put_next_entry(file.some_title)
zos.print IO.read(file.path)
end
end # Outputs zipfile as StringIO
s3 = Aws::S3.new(S3_KEY, S3_SECRET)
bucket = Aws::S3::Bucket.create(s3, S3_BUCKET)
compressed_filestream.rewind
bucket.put("#{BUCKET_PATH}/archive.zip", compressed_filestream.read, {}, 'authenticated-read')
write_buffer
返回StringIO,并在read
之前首先需要rewind该流。现在我不需要创建和删除tmpfile。
我现在只是想知道write_buffer
是否会比open
更广泛或更重?或者是相反的方式?