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)
    
    
  • 相关阅读:
    远程发送和接收数据流生成图片
    iTextSharp 设置 PDF 所有页面背景图功能
    iTextSharp 生成 PDF 问题集合
    C# 中 IL/MSIL , CTS , CLS , CLR , JIT 分别是什么 ?
    django创建项目2 jojo
    selenium键盘操作 jojo
    python格式化 jojo
    安装了Django后,执行djangoadmin.py无法创建工程的解决办法 jojo
    django创建项目1 jojo
    python自带模块模拟鼠标和键盘操作 jojo
  • 原文地址:https://www.cnblogs.com/wangjiale1024/p/14063827.html
Copyright © 2011-2022 走看看