代碼
package util
import (
"bytes"
"context"
"fmt"
"io"
"io/ioutil"
"mime/multipart"
"net/http"
"os"
)
// UploadFile 上傳文件
func UploadFile(ctx context.Context, url string, params map[string]string, fileName string) ([]byte, error) {
file, err := os.Open(fileName)
if err != nil {
fmt.Println(err)
return nil, err
}
defer file.Close()
body := new(bytes.Buffer)
writer := multipart.NewWriter(body)
for key, val := range params {
_ = writer.WriteField(key, val)
}
formFile, err := writer.CreateFormFile("file", fileName)
if err != nil {
log.Error("CreateFormFile err: %v, file: %s", err, file)
return nil, err
}
_, err = io.Copy(formFile, file)
if err != nil {
return nil, err
}
err = writer.Close()
if err != nil {
return nil, err
}
req, err := http.NewRequest("POST", url, body)
if err != nil {
log.Error("NewRequest err: %v, url: %s, body: %v", err, url, body)
return nil, err
}
req.Header.Set("Content-Type", writer.FormDataContentType())
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
log.Error("Do Request got err: %v, req: %v, resp: %v", err, req, resp)
return nil, err
}
defer resp.Body.Close()
content, err := ioutil.ReadAll(resp.Body)
if err != nil {
return nil, err
}
return content, nil
}
上傳文件的同時,帶其他參數
writer := multipart.NewWriter(&buff)
// 參數和文件
writer.WriteField("parma1", "11111")
writer.WriteField("parma2", 2222)
writer.WriteField("upt", cast.ToString(util.GetMillisTime()))
w, err := writer.CreateFormFile("file", "tmp_name")
if err != nil {
log.Error("err is: %v", err)
return nil, err
}
// check file exists
isExist, err := util.PathExists(fileName) // 也是我自己實現的函數,很簡單
if err != nil {
log.Error("check file exists got err: %v, fileName: %s", err, fileName)
}
if !isExist {
log.Error("file not exists, fileName: %s", fileName)
return nil, errors.New(fmt.Sprintf("file not exists, fileName: %s", fileName))
}
// copy file data to param
fd1, err := os.Open(fileName)
if err != nil {
log.Error("err is: %v", err)
return nil, err
}
defer fd1.Close()
_, err = io.Copy(w, fd1)
if err != nil {
log.Error("err is: %v", err)
return nil, err
}
writer.Close()
// 發送請求
var resp *http.Response
c := http.Client{}
resp, err = c.Post(path, writer.FormDataContentType(), &buff)