2013-04-11 9 views
6

ich diesen Code haben, die eine Zip-Datei auf die Festplatte schreibt, liest sie zurück, Uploads bis s3, löscht dann die Datei:Rubyzip: ZIP-Datei direkt in S3 exportieren, ohne tmpfile auf Platte zu schreiben?

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) 

Dieser Code funktioniert schon, aber was ich will, ist nicht die Zip erstellen Datei mehr, um ein paar Schritte zu sparen. Ich frage mich, ob es eine Möglichkeit gibt, die Zipfile-Daten direkt nach s3 zu exportieren, ohne zuerst eine tmpfile erstellen zu müssen, sie zurückzulesen und dann zu löschen?

Antwort

8

Ich denke, ich habe gerade die Antwort auf meine Frage gefunden.

Es ist Zip::ZipOutputStream.write_buffer. Ich überprüfe das und aktualisiere diese Antwort, wenn es funktioniert.

aktualisieren

Es funktioniert. Mein Code ist wie folgt nun:

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

Die write_buffer kehrt ein StringIO und braucht den Strom rewind bevor read es ing. Jetzt muss ich die tmpfile nicht erstellen und löschen.

Ich frage mich nur, ob write_buffer mehr Speicher umfangreich oder schwerer als open wäre? Oder ist es umgekehrt?

+0

Was ist 'some_file_list'? – Trip

+0

Ich vermute es ist etwas wie .. 'some_file_list = Zip :: ZipFile.open (zipped_file)' – Trip

+0

Könnte sein. Für mich habe ich meine Dateien von S3 gelesen. – index