zoukankan      html  css  js  c++  java
  • 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)
    
    
  • 相关阅读:
    定时器QTimer
    QDoubleSpinBox浮点型数字调节框
    pyqt5-步长调节器
    字体选择框QFontComboBox
    组合框-下拉选择框QCombox
    复选框QCheckBox
    CMake学习记录--list(列表操作命令)
    CMake命令之list
    make的link_directories命令不起作用
    Linux平台用C++实现事件对象,同步线程
  • 原文地址:https://www.cnblogs.com/wangjiale1024/p/14063827.html
Copyright © 2011-2022 走看看