csv - 输出到 csv 文件会将数据转储到浏览器,但不会转储到文件

标签 csv web go beego

我尝试将一些数据输出到 golang beego 框架中的 csv 文件,这是我的代码

records := make([][]string,len(devicesData))

for k,v := range devicesData{
    records[k] = []string{v.Fields.Country,v.Fields.Imei[0],v.Fields.Number[0]}
}

writer := csv.NewWriter(this.Controller.Ctx.ResponseWriter)
for _, record := range records {
    err := writer.Write(record)
    if err != nil {
        fmt.Println("Error:", err)
        return
    }
}

this.Ctx.Output.Header("Content-Type", "application/csv")
this.Ctx.Output.Header("Content-Disposition", "attachment; filename=MyVerySpecial.csv")

    writer.Flush()

但是在浏览器中只能显示记录数据,不能下载文件。我在这个下载文件 Controller 之前有一些日志 Controller 和过滤功能,我不知道它是否受到影响。我的代码有什么问题?谢谢

最佳答案

您应该始终首先 设置响应 header ,然后才开始将任何数据写入输出。我知道您在设置 header 字段后调用了 writer.Flush(),但这并不能保证在此之前不会刷新或发送数据 - 这意味着将发送默认 header 。在此之后,无法发送或更改其他 header 。

此外,CSV 的正确 mime 类型是 text/csv 而不是 application/csv ( rfc4180 )。

此外, header 更像是对浏览器的“建议”。这是您建议响应是要保存的文件的一件事,但是从服务器端您不能强制浏览器真正将响应保存到文件而不显示它。

参见 rfc1806 , rfc2183rfc6266有关 "Content-Disposition" header 字段的更多详细信息。它主要传达演示信息。

The Content-Disposition response header field is used to convey additional information about how to process the response payload, and also can be used to attach additional metadata, such as the filename to use when saving the response payload locally.

关于csv - 输出到 csv 文件会将数据转储到浏览器,但不会转储到文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31018042/

相关文章:

php - 通过php将csv文件上传到mysql

python - 如何在 Python 中将 csv 文件从宽格式转换为长格式

web - 使用 Apache Spark 进行分布式 Web 爬网 - 有可能吗?

android - 考虑移动设备设计 Flask 应用程序?

dictionary - 分配给 nil 映射中的条目

Powershell 查询 - 找不到路径的一部分

ruby - 如何将散列保存到 CSV 中

javascript - 我们如何动态生成证书?

go - 如何在外部包中对函数使用售卖参数?

go - 带有随机 AuthenticationRequired 的签名 URL 结果