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

Geo*_*rge 2 http file go server

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

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

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

这段代码的唯一问题是,每当我调用特定的处理程序时,它都会导致我下载一个名为"download"的文件.我想给用户正在下载自定义名称的文件,或者更确切地说,以尽可能浏览器中性的方式表示我希望文件具有某个名称.

我认为这可能是使用w.WriteHeader可行的吗?但我一直无法找到有关如何执行此操作的任何示例或明确指导.

Cer*_*món 6

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

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)
Run Code Online (Sandbox Code Playgroud)

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

通过调用ServeFile可以进一步简化代码:

w.Header().Set("Content-Disposition", "attachment; filename=YOURNAME")
http.ServeFile(w, r, file.Name)
Run Code Online (Sandbox Code Playgroud)