我尝试将一些数据输出到 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 , rfc2183和 rfc6266有关 "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/