9

我有这段代码,它将一个 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,读回它,然后删除它?

4

1 回答 1

10

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

它是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并且需要在ing之前倒带流。read现在我不需要创建和删除 tmpfile。

我现在只是想知道是否write_buffer会比内存更广泛或更重open?或者是周围的其他方式?

于 2013-04-11T12:07:28.357 回答