2013-06-05 15 views
5

Ich hole eine Daten von http-Service und ich möchte es on the fly entpacken. Hier ist meine aktuelle Ansatz: Wie entpacken Sie io.ReadCloser?

resp, err := http.Get(url) 
if err != nil { 
    logger.Fatalf("Can't fatch %s data. %v", url, err) 
} 
logger.Info("Fetched data from %s", url) 
content_zipped, err := ioutil.ReadAll(resp.Body) 
resp.Body.Close() 
if err != nil { 
    logger.Fatal(err) 
} 
zip_reader, err := zip.NewReader(bytes.NewReader(content_zipped), int64(len(content_zipped))) 

Gibt es eine Möglichkeit, die resp.Body ohne das Lesen der Inhalte auf einmal (6. Zeile) zu entpacken? Ich meine Stream die Bytes.

Antwort

9

Zip-Archive erfordern einen wahlfreien Zugriff zum Lesen, daher ist es schwierig, Bytes zu streamen. Insbesondere die Quelle für zip.Reader.init finden Sie hier: http://golang.org/src/pkg/archive/zip/reader.go?s=1265:1323#L59. Das erste, was es tut, ist Anruf readDirectoryEnd, die von nahe dem Ende der Datei liest.

Können Sie eine andere Komprimierungsmethode verwenden (z. B. gzip)? Dann können Sie gzip.NewReader(resp.Body) verwenden, um die Daten zu streamen.

+0

Die Daten vom Dienst sind eine Zip-Datei. –

Verwandte Themen