我的代码从远程 url 获取文件并在浏览器中下载文件:
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)
}
}
code: http://play.golang.org/p/x-EyR2zFjv http://play.golang.org/p/x-EyR2zFjv
获取文件是可以的,但是如何在浏览器中下载呢?
要使浏览器打开下载对话框,请添加Content-Disposition
and 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_ http://play.golang.org/p/v9IAu2Xu3_
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)