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

时间:2015-06-24 05:06:18

标签: 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()

但是,它只显示浏览器中的记录数据,因此无法下载该文件。我在这个下载文件控制器之前有一些登录控制器和过滤功能,我不管它是否受到影响。我的代码出了什么问题?感谢

1 个答案:

答案 0 :(得分:2)

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

CSV的正确mime类型还有text/csv而非application/csvrfc4180)。

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

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

  

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