2013-04-11 13 views
6

Mam ten kod, który zapisuje plik zip na dysku, czyta je z powrotem, przesłane do S3, a następnie usuwa plik:Rubyzip: Eksportuj plik ZIP bezpośrednio do S3 bez zapisywania pliku tmp na dysku?

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) 

ten kod działa już ale co ja chcę to nie tworzyć zip plik już więcej, aby zapisać kilka kroków. Zastanawiam się, czy istnieje sposób na wyeksportowanie danych zipfile bezpośrednio do s3 bez konieczności tworzenia pliku tmp, odczytywania go, a następnie usuwania?

Odpowiedz

8

Myślę, że właśnie znalazłem odpowiedź na moje pytanie.

To jest Zip::ZipOutputStream.write_buffer. Sprawdzę to i zaktualizuję tę odpowiedź, gdy ją uruchomię.

Aktualizacja

To działa. Mój kod jest jak to teraz:

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

W write_buffer Zwraca StringIO i musi rewind strumień zanim read ing go. Teraz nie muszę tworzyć i usuwać pliku tmp.

Zastanawiam się teraz, czy write_buffer będzie więcej pamięci lub cięższe niż open? Czy jest odwrotnie?

+0

Co to jest 'some_file_list'? – Trip

+0

Zgaduję, że jest to coś w stylu .. 'some_file_list = Zip :: ZipFile.open (zipped_file)' – Trip

+0

Może być. Dla mnie czytałem moje pliki z S3. – index

Powiązane problemy