2014-06-09 9 views
13

मेरे कोड प्राप्त फ़ाइल:गोलांग - गोलांग सर्वर से ब्राउज़र में फ़ाइल कैसे डाउनलोड करें? दूरदराज के यूआरएल और ब्राउज़र में डाउनलोड फ़ाइल से

func Index(w http.ResponseWriter, r *http.Request) { 
    url := "http://upload.wikimedia.org/wikipedia/en/b/bc/Wiki.png" 

    ... 

    resp, err := client.Get(url) 
    if err != nil { 
     fmt.Println(err) 
    } 
    defer resp.Body.Close() 

    body, err := ioutil.ReadAll(resp.Body) 
    if err != nil { 
     fmt.Println(err) 
    } 

    fmt.Println(len(body)) 
    //download the file in browser 

} 

func main() { 
    http.HandleFunc("/", Index) 
    err := http.ListenAndServe(":8000", nil) 

    if err != nil { 
     fmt.Println(err) 
    } 
} 

कोड: http://play.golang.org/p/x-EyR2zFjv

प्राप्त फ़ाइल ठीक है, लेकिन कैसे ब्राउज़र में इसे डाउनलोड करने के लिए?

धन्यवाद।

+0

उपरोक्त कोड में ग्राहक क्या है ?? –

उत्तर

33

ब्राउज़र डाउनलोड संवाद खोलने बनाने के लिए, जवाबी कार्रवाई के लिए एक Content-Disposition और Content-Type हेडर जोड़ें:

w.Header().Set("Content-Disposition", "attachment; filename=WHATEVER_YOU_WANT") 
w.Header().Set("Content-Type", r.Header.Get("Content-Type")) 

क्या यह ग्राहक के लिए सामग्री भेजने से पहले। आप उचित प्रगति दिखाने के लिए, ग्राहक के जवाब के Content-Length शीर्षलेख की प्रतिलिपि बनाना चाहेंगे।

पूरी तरह से स्मृति में लोड हो रहा है (बड़ी फ़ाइलों के लिए यह महत्वपूर्ण है) के बिना ग्राहक के जवाब शरीर को स्ट्रीम करने - बस प्रतिक्रिया लेखक को शरीर पाठक कॉपी:

io.Copy(w, resp.Body) 

io.Copy एक अच्छी छोटी समारोह है जो एक पाठक इंटरफ़ेस और लेखक इंटरफ़ेस लेता है, एक से डेटा पढ़ता है और इसे दूसरे को लिखता है। इस तरह के सामान के लिए बहुत उपयोगी!

मैं यह करने के लिए अपने कोड को संशोधित किया गया है: http://play.golang.org/p/v9IAu2Xu3_

+5

यदि आपके पास फ़ाइल नाम में रिक्त स्थान हैं, तो filename = arg को उद्धरण के साथ लपेटना सुनिश्चित करें, उदा। 'filename =" आप जहां भी चाहते हैं "'। – kainjow

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