Golang将提供的文件名称传达给浏览器/客户端

时间:2017-06-13 00:35:23

标签: file http go server

我使用golang动态提供一些文件,以下代码处理实际的文件服务:

        data, err := ioutil.ReadFile(file.Path)
        logo.RuntimeError(err)
        http.ServeContent(w, r, file.Name, time.Now(), bytes.NewReader(data))

在之前的代码"文件"只是一个自定义结构,包含有关该文件的各种信息。

此代码的唯一问题是它导致我下载名为" download"每当我调用特定的处理程序。我想提供用户正在下载自定义名称的文件,或者更确切地说,表示我希望文件具有特定名称的浏览器中性。

我认为这可能是使用w.WriteHeader可行的吗?但我一直无法找到任何关于如何做到这一点的例子或明确指导。

1 个答案:

答案 0 :(得分:5)

在提供内容之前设置content disposition标题:

f, err := os.Open(file.Path)
if err != nil {
    // handle error
}
defer f.Close()
fi, err := f.Stat()
if err != nil {
     // handle error
}
w.Header().Set("Content-Disposition", "attachment; filename=YOURNAME")
http.ServeContent(w, r, file.Name, fi.ModTime(), f)

请注意,此代码将* os.File直接传递给ServeContent,而不是将整个文件读取到内存中。

通过调用ServeFile

可以进一步简化代码
w.Header().Set("Content-Disposition", "attachment; filename=YOURNAME")
http.ServeFile(w, r, file.Name)