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 }