Rubyzip:直接将zip文件导出到S3,不需要将tmpfile写入磁盘



我有这样一段代码,它将一个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,而不必首先创建一个tmpfile,读取它,然后删除它?

我想我刚刚找到了问题的答案。

的邮政编码::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返回之前需要先倒带流。现在我不需要创建和删除tmpfile了。

我只是想知道如果write_buffer会更多的内存扩展或比open重?还是反过来呢?

相关内容

  • 没有找到相关文章

最新更新