4

我试图在 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()

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

4

1 回答 1

3

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

CSV 的正确 mime 类型text/csv也不是application/csv( rfc4180 )。

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

有关标头字段的更多详细信息,请参阅rfc1806rfc2183rfc6266 。"Content-Disposition"基本上它传达演示信息。

Content-Disposition 响应头字段用于传达有关如何处理响应负载的附加信息,也可用于附加其他元数据,例如在本地保存响应负载时使用的文件名。

于 2015-06-24T06:23:15.543 回答