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 ファイルを作成しないようにしたいと考えています。最初に tmpfile を作成し、読み戻してから削除することなく、zipfile データを s3 に直接エクスポートする方法があるかどうか疑問に思っていましたか?

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')

StringIOwrite_bufferを返し、ストリームを巻き戻す前に最初にストリームを巻き戻す必要があります。これで、tmpfile を作成および削除する必要がなくなりました。read

私は今、write_bufferメモリがより広範であるか、より重いかどうか疑問に思っていopenますか? それとも逆ですか?

于 2013-04-11T12:07:28.357 に答える