2013-06-05 14 views
5

Prendo un dato dal servizio http e voglio decomprimerlo al volo. Qui è il mio approccio attuale: Come decomprimere 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))) 

C'è un modo per decomprimere il resp.Body senza leggere tutto il contenuto in una volta (6 line)? Intendo per stream i byte.

risposta

9

Gli archivi zip richiedono l'accesso casuale per la lettura, quindi è difficile eseguire lo streaming dei byte. In particolare, vedere la fonte per zip.Reader.init qui: http://golang.org/src/pkg/archive/zip/reader.go?s=1265:1323#L59. La prima cosa che fa è chiamare readDirectoryEnd che legge da vicino alla fine del file.

È possibile utilizzare un metodo di compressione diverso (ad esempio, gzip)? Quindi è possibile utilizzare gzip.NewReader(resp.Body) per lo streaming dei dati.

+0

I dati del servizio sono un file zip. –