【问题标题】:Go how to response csv file? [duplicate]Go 如何响应 csv 文件? [复制]
【发布时间】:2021-09-10 17:12:08
【问题描述】:

我正在用 Go 创建一个服务器,我想用一个 CSV 文件来响应。

我写了以下内容,这不会导致浏览器下载 CSV 文件。如何提示浏览器下载 CSV 文件?

import "github.com/gocarina/gocsv"

type Test struct {
    ID   int
    Name string
    Delete string
}

router.Get("/test", func(writer http.ResponseWriter, request *http.Request) {
    writer.WriteHeader(http.StatusOK)


    tests := []*Test{
        {
            ID:   1,
            Name: "a",
            Delete: "delete",
        },
        {
            ID:   2,
            Name: "b",
            Delete: "delete",
        },
    }

    w := multipart.NewWriter(writer)
    ww, err := w.CreateFormFile("file.csv", "file.csv")
    if err != nil {
        logger.Error("CreateFormfile", zap.Error(err))
    }
    gocsv.Marshal(tests, ww)

})

【问题讨论】:

  • 准确定义“不工作”。实际上,您将构成您问题的更大部分。不幸的是,对“它不起作用”问题的唯一答案是“存在一些问题”,这不是很有用。请参阅this
  • 您好,感谢您的建议。我添加声明是什么问题。
  • 嗨 penlight,您的 gocsv 依赖项的完整导入路径是什么?谢谢。
  • 我添加了gocsv导入路径。

标签: csv go multipartform-data


【解决方案1】:
推荐的答案 Go Language

如果您想告诉浏览器将响应呈现为要下载的文件,您可以使用Content-Disposition 标头:

rw.Header().Add("Content-Disposition", `attachment; filename="test.csv"`)

就输出 CSV 文档本身而言, 我不确定你想通过多部分编码响应来实现什么,但你应该将 CSV 文件直接编组到原始 HTTP 响应编写器中:

router.Get("/test", func(rw http.ResponseWriter, req *http.Request) {

        tests := []*Test{
            {
                ID:   1,
                Name: "a",
                Delete: "delete",
            },
            {
                ID:   2,
                Name: "b",
                Delete: "delete",
            },
        }

        gocsv.Marshal(tests, rw)

})

【讨论】:

  • 只是为了补充答案,添加rw.Header().Set("Content-Type", "text/csv") 可能是个好主意。如果响应应该在浏览器中触发下载,而不是仅仅被渲染,那么还有rw.Header().Set("Content-Disposition", "attachment;filename=tests.csv")
  • 谢谢。我想下载 csv 文件。我不知道必要的标题。您的补充很有帮助。
  • @mkopriva,根据更新后的问题,我想说你的评论实际上是一个正确的答案,+1。
猜你喜欢
  • 2018-07-26
  • 1970-01-01
  • 1970-01-01
  • 2017-10-30
  • 1970-01-01
  • 2020-11-24
  • 1970-01-01
  • 2016-03-05
  • 1970-01-01
相关资源
最近更新 更多