| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105 |
- package util
- import (
- "io"
- "mime/multipart"
- "net/http"
- "os"
- )
- /**
- http-server 响应file流
- */
- func ResponseFile(writer http.ResponseWriter, fileName string, body io.Reader) error {
- writer.Header().Set("Content-Type", "application/octet-stream")
- writer.Header().Set("Content-Disposition", "attachment; filename="+fileName)
- writer.Header().Set("Content-Transfer-Encoding", "binary")
- _, err := io.Copy(writer, body)
- return err
- }
- func ResponseFileV2(writer http.ResponseWriter, fileName string) {
- writer.Header().Set("Content-Type", "application/octet-stream")
- writer.Header().Set("Content-Disposition", "attachment; filename="+fileName)
- writer.Header().Set("Content-Transfer-Encoding", "binary")
- }
- /**
- http-client 请求文件流
- */
- type FileForm struct {
- filedName string
- fileName string
- // form file
- filePath string
- // form stream
- reader io.Reader
- }
- func NewFileFormFromFile(fieldName, fileName, filePath string) FileForm {
- return FileForm{
- filedName: fieldName,
- fileName: fileName,
- filePath: filePath,
- }
- }
- func NewFileFormFromStream(fieldName, fileName string, reader io.Reader) FileForm {
- return FileForm{
- filedName: fieldName,
- fileName: fileName,
- reader: reader,
- }
- }
- /**
- 创建 Content-Type: multipart/form-data 的请求
- 返回参数1是 请求体
- 返回参数2是 Content-Type的value ,记得设置请求header Content-Type:参数2
- 返回参数3是 异常
- */
- func NewMultiFormRequest(params map[string]string, fileTypeParams []FileForm) (_ io.Reader, _ string, err error) {
- requestBody := newRequestBody()
- bodyWriter := multipart.NewWriter(requestBody)
- defer func() {
- err = bodyWriter.Close()
- }()
- writeFile := func(file FileForm) (err error) {
- fileWriter, err := bodyWriter.CreateFormFile(file.filedName, file.fileName)
- if err != nil {
- return err
- }
- if file.reader == nil {
- fileReader, err := os.Open(file.filePath)
- if err != nil {
- return err
- }
- defer func() {
- err = fileReader.Close()
- }()
- file.reader = fileReader
- }
- _, err = io.Copy(fileWriter, file.reader)
- if err != nil {
- return err
- }
- return nil
- }
- writeParams := func(key, value string) error {
- return bodyWriter.WriteField(key, value)
- }
- for key, value := range params {
- if err := writeParams(key, value); err != nil {
- return nil, "", err
- }
- }
- for _, file := range fileTypeParams {
- if err := writeFile(file); err != nil {
- return nil, "", err
- }
- }
- contentType := bodyWriter.FormDataContentType()
- return requestBody, contentType, nil
- }
|