123456789101112131415161718192021222324252627282930313233343536373839404142434445 |
- package model
- import (
- "encoding/csv"
- "fmt"
- "net/http"
- "github.com/pkg/errors"
- )
- // CSV Comma-Separated Values struct.
- type CSV struct {
- Data [][]string
- Title string
- }
- var csvContentType = []string{"text/csv; charset=utf-8"}
- // Render (CSV) writes data with CSV ContentType.
- func (c CSV) Render(w http.ResponseWriter) (err error) {
- c.WriteContentType(w)
- writer := csv.NewWriter(w)
- bomUtf8 := []byte{0xEF, 0xBB, 0xBF}
- writer.Write([]string{string(bomUtf8[:])})
- writer.WriteAll(c.Data)
- if err = writer.Error(); err != nil {
- err = errors.WithStack(err)
- }
- return
- }
- func writeContentType(w http.ResponseWriter, value []string, title string) {
- header := w.Header()
- if val := header["Content-Type"]; len(val) == 0 {
- header["Content-Type"] = value
- }
- if title != "" {
- header["Content-Disposition"] = append(header["Content-Disposition"], fmt.Sprintf("attachment; filename=%s.csv", title))
- }
- }
- // WriteContentType write CSV ContentType.
- func (c CSV) WriteContentType(w http.ResponseWriter) {
- writeContentType(w, csvContentType, c.Title)
- }
|