作者:星仔走天涯k | 来源:互联网 | 2023-02-01 14:01
我正在使用golang动态提供一些文件,以下代码处理文件的实际服务:
data, err := ioutil.ReadFile(file.Path)
logo.RuntimeError(err)
http.ServeContent(w, r, file.Name, time.Now(), bytes.NewReader(data))
在前面的代码中,"file"只是一个自定义结构,包含有关该文件的各种信息.
这段代码的唯一问题是,每当我调用特定的处理程序时,它都会导致我下载一个名为"download"的文件.我想给用户正在下载自定义名称的文件,或者更确切地说,以尽可能浏览器中性的方式表示我希望文件具有某个名称.
我认为这可能是使用w.WriteHeader可行的吗?但我一直无法找到有关如何执行此操作的任何示例或明确指导.
1> Cerise Limón..:
在提供内容之前设置内容处置标题:
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)