下载文件时如何使客户端打开保存文件对话框

时间:2017-07-06 08:11:37

标签: http go web download

我希望浏览器显示或打开文件保存对话框,以保存用户点击下载文件按钮时发送的文件。

我的服务器端代码供下载:

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

    timeout := time.Duration(5) * time.Second
    transport := &http.Transport{
        ResponseHeaderTimeout: timeout,
        Dial: func(network, addr string) (net.Conn, error) {
            return net.DialTimeout(network, addr, timeout)
        },
        DisableKeepAlives: true,
    }
    client := &http.Client{
        Transport: transport,
    }
    resp, err := client.Get(url)
    if err != nil {
        fmt.Println(err)
    }
    defer resp.Body.Close()

    //copy the relevant headers. If you want to preserve the downloaded file name, extract it with go's url parser.
    w.Header().Set("Content-Disposition", "form-data; filename=Wiki.png")
    w.Header().Set("Content-Type", r.Header.Get("Content-Type"))
    w.Header().Set("Content-Length", r.Header.Get("Content-Length"))
    //dialog.File().Filter("XML files", "xml").Title("Export to XML").Save()
    //stream the body to the client without fully loading it into memory
    io.Copy(w, resp.Body)
}

1 个答案:

答案 0 :(得分:4)

如果您希望在客户端保存响应,请使用"attachment"内容处置类型。详情见rfc2183,第2.2节:

  

2.2附件处理类型

     

Bodyparts可以被指定为“附件”以表明它们是      与邮件主体分开,并表示他们的      显示不应该是自动的,而是取决于某些进一步的      用户的行动。 MUA可能会提供一个用户      位图终端,带有附件的图标表示,或者,      在字符终端上,附带一个附件列表      用户可以选择查看或存储。

所以设置如下:

w.Header().Set("Content-Disposition", "attachment; filename=Wiki.png")

同样,在设置回复作者w的标题时,请复制您所做回复的字段,而不是来自传入请求:

w.Header().Set("Content-Type", resp.Header.Get("Content-Type"))
w.Header().Set("Content-Length", resp.Header.Get("Content-Length"))

另请注意,标题更像是浏览器的“提案”。这是你建议响应是要保存的文件的一件事,但是从服务器端你不能强制浏览器真正保存对文件的响应而不显示它。

请参阅相关问题:Golang beego output to csv file dumps the data to browser but not dump to file