2012-10-25 8 views
5
Datei lesen

Ich habe ein TempFile Objekt, das eine Zip-Datei ist, und ich möchte von ihm lesen wie folgt:Rubin: eine temporäre zip

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

Allerdings, wenn ich dies tun, erhalte ich die folgende Fehler :

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

ich habe auch versucht

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

Aber das gibt

can't dup NilClass 

Wie kann ich eine temporäre Zip-Datei verarbeiten?

Antwort

2

Es stellt sich heraus, dass die temporäre Datei beschädigt wurde, so dass die

can't dup NilClass 

Fehler als Ergebnis des Versuches, die beschädigte Datei zu lesen.

Daher ist die Lösung

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

Wenn dies Ihr Problem gelöst hat, markieren Sie bitte Ihre eigene Antwort als akzeptiert. –

3

Sehen Sie im folgenden Artikel http://info.michael-simons.eu/2008/01/21/using-rubyzip-to-create-zip-files-on-the-fly/, die erläutert, wie die einfachere Schnittstelle Zip verwenden :: ZipOutputStream, wenn Sie mit einer Arbeit Tempfile

+1

Interessant - ich denke daran, wenn ich in eine temporäre Zip-Datei schreiben muss. Ich habe jedoch eine andere Situation: Ich muss zip-Einträge aus einer temporären Datei lesen, die aus einem Download erstellt wurde. – Kkkev

0

ich vor dem gleichen Fehler zu verwenden, aber ich fand heraus, nach dem Graben, dass diese Zip-Datei in binären

dh sein sollte, sie zuerst zu einem gewissen Datei kopiert in binär-Modus, dann können Sie es mit ZIP-Modul entpacken, ohne den Fehler gegenüber

Beispielcode

#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