2012-10-25 15 views
5

Mam TempFile obiekt, który jest plik zip, i życzę, aby odczytać z niego w następujący sposób:Ruby: czytanie tymczasowy plik ZIP

Zip::ZipFile.open_buffer(tempfile) do |zipfile| 
    ... 
end 

Jednak, kiedy to zrobić, pojawia się następujący błąd :

Zip::ZipFile.open_buffer expects an argument of class String or IO. Found: Tempfile 

próbowałem zostały również

Zip::ZipFile.open(tempfile.path) do |zipfile| 
    ... 
end 

Ale zwraca

Jak mogę przetworzyć tymczasowy plik zip?

Odpowiedz

2

Okazuje się, że plik tymczasowy został uszkodzony, więc

can't dup NilClass 
Błąd

był wynikiem próby odczytania uszkodzonego pliku.

Dlatego rozwiązaniem jest użycie

Zip::ZipFile.open(tempfile.path) do |zipfile| 
    ... 
end 
+0

jeśli to rozwiązało Twój problem, zaznacz swoją odpowiedź jako zaakceptowaną. –

0

wychodził ten sam błąd, ale po wykopaniu okazało się, że to plik zip powinien być w formacie binarnym

czyli najpierw skopiować je do jakiegoś pliku w tryb binarny następnie można rozpakować go przy użyciu modułu ZIP nie napotykając błąd

przykładowy kod

#copying zip file to a new file in binary mode 

filename = "empty.zip" 
File.open(filename, "wb") do |empty_file| 
    open("#{zipfile_url}", 'rb') do |read_file| 
    empty_file.write(read_file.read) 
    end 
end 

#now you can open the zip file 

Zip::File.open(filename) do |f| 
    . . . 
end