2013-04-11 14 views
6

私は、ディスクにzipファイルを書き込み、このコードを、持って戻ってそれを読み込み、S3にアップロードし、ファイルを削除します。Rubyzip:tmpfileをディスクに書き込まなくても、S3に直接ZIPファイルをエクスポートできますか?

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に直接書き出す方法があるかどうか疑問に思っていました。

答えて

8

私はちょうど私の質問に対する答えを見つけたと思う。

これは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_bufferStringIOを返し、それをINGのread前に、最初のストリームをrewindする必要があります。これで、tmpfileを作成して削除する必要はありません。

write_bufferopenよりも拡張されているか重いメモリになっているのではないかと疑問に思っていますか?それともそれ以外の方法ですか?

+0

'some_file_list'とは何ですか? – Trip

+0

私はそのようなものを推測しています。 'some_file_list = Zip :: ZipFile.open(zipped_file)' – Trip

+0

あります。私にとって、私はS3から自分のファイルを読んでいました。 – index

関連する問題