我试图将一些数据输出到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()
但是,它只显示浏览器中的记录数据,因此无法下载该文件。我在这个下载文件控制器之前有一些登录控制器和过滤功能,我不管它是否受到影响。我的代码出了什么问题?感谢
答案 0 :(得分:2)
您应该始终设置响应标头优先,然后才开始将任何数据写入输出。我知道您在设置标题字段后调用writer.Flush()
,但无法保证在此之前不会刷新或发送数据 - 这将意味着发送默认标头。在此之后,不能发送或更改其他标头。
CSV的正确mime类型还有text/csv
而非application/csv
(rfc4180)。
标题更像是浏览器的"提案" 。您建议响应的一件事是要保存的文件,但是从服务器端,您不能强制浏览器真正将响应保存到文件而不显示它。
有关"Content-Disposition"
标头字段的详细信息,请参阅rfc1806,rfc2183和rfc6266。基本上它传达了演示信息。
Content-Disposition响应标头字段用于传达 有关如何处理响应有效负载的其他信息,以及 也可用于附加其他元数据,例如文件名 在本地保存响应有效负载时使用。