我的代码从远程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) } }
代码:http://play.golang.org/p/x-EyR2zFjv
可以获取文件,但是如何在浏览器中下载文件?
要使浏览器打开下载对话框,请在响应中添加Content-Disposition和Content-Type标头:
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响应的标头复制到客户端,以显示适当的进度。
Content-Length
要将响应主体流传输到客户端而不将其完全加载到内存中(对于大文件,这很重要)-只需将主体读取器复制到响应写入器即可:
io.Copy(w, resp.Body)
io.Copy是一个不错的小功能,它具有读取器接口和写入器接口,可从一个接口读取数据并将其写入另一个接口。这种东西非常有用!
io.Copy
我已经修改了您的代码来执行此操作:http : //play.golang.org/p/v9IAu2Xu3_