You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
45 lines
1.0 KiB
45 lines
1.0 KiB
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) |
|
}
|
|
|