[ golang使用http响应csv文件 ]


golang里http 响应csv文件

响应头配置

package guitar

import (
    "io"
    "net/http"

    "go-weixin/app/guitar/api/internal/logic/guitar"
    "go-weixin/app/guitar/api/internal/svc"
    "go-weixin/app/guitar/api/internal/types"
    "go-weixin/common/utils"

    "github.com/zeromicro/go-zero/rest/httpx"
    xhttp "github.com/zeromicro/x/http"
)

func GuitarCsvHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
    return func(w http.ResponseWriter, r *http.Request) {
        var req types.GuitarCsvReq
        if err := httpx.Parse(r, &req); err != nil {
            xhttp.JsonBaseResponseCtx(r.Context(), w, err)
            return
        }

        l := guitar.NewGuitarCsvLogic(r.Context(), svcCtx)
        resp, err := l.GuitarCsv(&req)
        if err != nil {
            xhttp.JsonBaseResponseCtx(r.Context(), w, err)
        } else {
            utils.SetCsvHeader(w)
            writer := io.Writer(w)
            writer.Write(resp.CsvData)
        }
    }
}

SetCsvHeader

func SetCsvHeader(w http.ResponseWriter) {
    w.Header().Set("Content-Type", "text/csv")
    w.Header().Set("Content-Disposition", "attachment; filename=guitar.csv")
    w.WriteHeader(200)
}

数据处理

func (l *GuitarCsvLogic) GuitarCsv(req *types.GuitarCsvReq) (resp *types.GuitarCsvResp, err error) {
    var csvData [][]string
    var csvDataRowJoin []string
    var csvDataString string

    csvData = [][]string{
        {"Name", "Age", "City"},
        {"John", "30", "New York"},
        {"Alice", "25", "London"},
        {"Bob", "35", "Paris"},
    }
    for _, v := range csvData {
        csvDataRowJoin = append(csvDataRowJoin, strings.Join(v, ","))
    }

    csvDataString = strings.Join(csvDataRowJoin, "\n")

    resp = new(types.GuitarCsvResp)
    resp.CsvData = []byte(csvDataString)
    return
}

注意点: 1. 在一行内的数据使用,逗号分隔在excel打开就会填入对应的格子