2013-06-05 37 views
5

Tôi tìm nạp dữ liệu từ dịch vụ http và tôi muốn giải nén dữ liệu khi đang bay. Đây là cách tiếp cận hiện tại của tôi: Làm thế nào để giải nén 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ó cách nào để giải nén resp.Body mà không đọc toàn bộ nội dung cùng một lúc (6. dòng)? Ý của tôi là luồng các byte.

Trả lời

9

Lưu trữ zip yêu cầu quyền truy cập ngẫu nhiên để đọc, do đó khó có thể truyền byte. Đặc biệt, hãy xem mã nguồn của zip.Reader.init tại đây: http://golang.org/src/pkg/archive/zip/reader.go?s=1265:1323#L59. Điều đầu tiên nó làm là gọi readDirectoryEnd đọc từ gần cuối tệp.

Bạn có thể sử dụng phương pháp nén khác (ví dụ: gzip) không? Sau đó, bạn có thể sử dụng gzip.NewReader(resp.Body) để truyền dữ liệu.

+0

Dữ liệu từ dịch vụ là tệp zip. –

Các vấn đề liên quan