我使用golang动态提供一些文件,以下代码处理实际的文件服务:
data, err := ioutil.ReadFile(file.Path)
logo.RuntimeError(err)
http.ServeContent(w, r, file.Name, time.Now(), bytes.NewReader(data))
在之前的代码"文件"只是一个自定义结构,包含有关该文件的各种信息。
此代码的唯一问题是它导致我下载名为" download"每当我调用特定的处理程序。我想提供用户正在下载自定义名称的文件,或者更确切地说,表示我希望文件具有特定名称的浏览器中性。
我认为这可能是使用w.WriteHeader可行的吗?但我一直无法找到任何关于如何做到这一点的例子或明确指导。
答案 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)