Post上传文件

package main

import (
    "bytes"
    "encoding/json"
    "fmt"
    "io"
    "io/ioutil"
    "log"
    "mime/multipart"
    "net/http"
    "os"
    "path/filepath"
)

func newfileUploadRequest(uri string, params map[string]string, paramName, path string) (UploadFileRes, error) {
    file, err := os.Open(path)
    if err != nil {
        return UploadFileRes{}, err
    }
    defer file.Close()

    body := &bytes.Buffer{}
    writer := multipart.NewWriter(body)
    part, err := writer.CreateFormFile(paramName, filepath.Base(path))
    if err != nil {
        return UploadFileRes{}, err
    }
    _, err = io.Copy(part, file)

    for key, val := range params {
        _ = writer.WriteField(key, val)
    }
    err = writer.Close()
    if err != nil {
        return UploadFileRes{}, err
    }

    request, err := http.NewRequest("POST", uri, body)
    if err != nil {
        log.Fatal(err)
        return UploadFileRes{}, err
    }
    request.Header.Add("Content-Type", writer.FormDataContentType())
    client := &http.Client{}
    resp, err := client.Do(request)
    if err != nil {
        log.Fatal(err)
        return UploadFileRes{}, err
    } else {
        defer resp.Body.Close()
        body, err := ioutil.ReadAll(resp.Body)
        // body := &bytes.Buffer{}
        // _, err := body.ReadFrom(resp.Body)
        if err != nil {
            log.Fatal(err)
        }

        // fmt.Println(resp.StatusCode)
        // fmt.Println(resp.Header)
        // fmt.Println(body.Bytes())

        var uploadFileRes UploadFileRes
        json.Unmarshal(body, &uploadFileRes)
        return uploadFileRes, nil
    }
    return UploadFileRes{}, fmt.Errorf("lib throwe")
}

func main() {

    extraParams := map[string]string{}
    res, err := newfileUploadRequest("http://192.168.1.56:1502/uploadeFile", extraParams, "file", "/home/koala/project/tmp/images/1.png")
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println(res)

    sep := string(os.PathSeparator)
    fmt.Println(sep)
}

type UploadFileRes struct {
    ErrCode string `json:"errCode"`
    ErrMsg  string `json:"errMsg"`
    Data    string `json:"data"`
}