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打开就会填入对应的格子