【问题标题】:Golang communicating the name of the file served to the browser/clientGolang 将提供给浏览器/客户端的文件的名称通信
【发布时间】:2017-11-14 14:12:59
【问题描述】:

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

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

在前面的代码中,“文件”只是一个自定义结构,包含有关文件的各种信息。

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

我认为这可能使用 w.WriteHeader 可行?但我一直找不到任何示例或明确的指导方针来说明如何做到这一点。

【问题讨论】:

    标签: file http go server


    【解决方案1】:

    在提供内容之前设置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)
    

    【讨论】:

    • w.Header().Set("Content-Disposition", "attachment; filename=YOURNAME")
    猜你喜欢
    • 2012-09-11
    • 1970-01-01
    • 2012-07-23
    • 2012-01-17
    • 2015-07-18
    • 2015-07-25
    • 2011-12-30
    • 2011-05-29
    • 2020-02-12
    相关资源
    最近更新 更多