golang 带参数 发送、上传本地文件到其他机器、服务器

代码

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)

原文地址:https://www.cnblogs.com/wangjiale1024/p/14063827.html