github.com/artisanhe/tools@v1.0.1-0.20210607022958-19a8fef2eb04/misc/form_data_request/form_data_request.go (about) 1 /* 2 do request for formData with file 3 */ 4 package form_data_request 5 6 import ( 7 "bytes" 8 "encoding/json" 9 "fmt" 10 "io" 11 "io/ioutil" 12 "mime/multipart" 13 "net/http" 14 "time" 15 16 "github.com/artisanhe/tools/courier/status_error" 17 ) 18 19 func NewFileRequest(uri string, fileHeader *multipart.FileHeader) (*http.Request, error) { 20 fileContents, err := fileHeader.Open() 21 if err != nil { 22 return nil, err 23 } 24 defer fileContents.Close() 25 26 body := &bytes.Buffer{} 27 writer := multipart.NewWriter(body) 28 part, err := writer.CreatePart(fileHeader.Header) 29 if err != nil { 30 return nil, err 31 } 32 _, err = io.Copy(part, fileContents) 33 if err != nil { 34 return nil, err 35 } 36 37 err = writer.Close() 38 if err != nil { 39 return nil, err 40 } 41 42 req, err := http.NewRequest("POST", uri, body) 43 if err != nil { 44 return nil, err 45 } 46 req.Header.Set("Content-Type", writer.FormDataContentType()) 47 48 return req, nil 49 } 50 51 func DoClient(req *http.Request, timeOut time.Duration, respResult interface{}) error { 52 client := &http.Client{ 53 Timeout: timeOut, 54 } 55 resp, err := client.Do(req) 56 if err != nil { 57 return err 58 } 59 defer resp.Body.Close() 60 61 data, err := ioutil.ReadAll(resp.Body) 62 63 if err != nil { 64 return err 65 } 66 67 if resp.StatusCode/200 == 1 { 68 err := json.Unmarshal(data, respResult) 69 if err != nil { 70 msg := fmt.Sprintf("[%d] %s %s", resp.StatusCode, req.Method, req.URL) 71 return status_error.HttpRequestFailed.StatusError().WithDesc(msg) 72 } 73 return nil 74 } else { 75 statusError := &status_error.StatusError{} 76 err := json.Unmarshal(data, statusError) 77 if err != nil { 78 msg := fmt.Sprintf("[%d] %s %s", resp.StatusCode, req.Method, req.URL) 79 return status_error.HttpRequestFailed.StatusError().WithDesc(msg) 80 } 81 return nil 82 } 83 }