2013-06-05 6 views
5

मैं http सेवा से एक डेटा प्राप्त करता हूं और मैं इसे पर फ्लाई पर अनजिप करना चाहता हूं। 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))) 

वहाँ एक ही बार में (6. लाइन) सभी सामग्री पढ़ने के बिना resp.Body अनज़िप करने के लिए कोई तरीका है: यहाँ मेरी वर्तमान दृष्टिकोण है? मेरा मतलब है स्ट्रीम बाइट्स।

उत्तर

9

ज़िप अभिलेखागार को पढ़ने के लिए यादृच्छिक पहुंच की आवश्यकता होती है, इसलिए बाइट स्ट्रीम करना मुश्किल है। विशेष रूप से, zip.Reader.init के लिए स्रोत यहां देखें: http://golang.org/src/pkg/archive/zip/reader.go?s=1265:1323#L59। पहली बात यह है कि readDirectoryEnd पर कॉल करें जो फ़ाइल के अंत के पास से पढ़ता है।

क्या आप एक अलग संपीड़न विधि (उदाहरण के लिए, gzip) का उपयोग कर सकते हैं? फिर आप डेटा स्ट्रीम करने के लिए gzip.NewReader(resp.Body) का उपयोग कर सकते हैं।

+0

सेवा से डेटा एक ज़िप फ़ाइल है। –

संबंधित मुद्दे