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)
    
    
  • 相关阅读:
    Swift游戏实战-跑酷熊猫 14 熊猫打滚
    Swift游戏实战-跑酷熊猫 13 二段跳的实现
    Swift游戏实战-跑酷熊猫 12 与平台的碰撞
    Swift游戏实战-跑酷熊猫 11 欢迎进入物理世界
    Swift游戏实战-跑酷熊猫 10 视差滚动背景
    Swift游戏实战-跑酷熊猫 09 移除场景之外的平台
    ANE-调用原生地图注意点
    ANE-如何加入ane,调试时又不报错
    ANE-调用原生组件横屏定位问题
    qrcode.js的识别解析二维码图片和生成二维码图片
  • 原文地址:https://www.cnblogs.com/wangjiale1024/p/14063827.html
Copyright © 2011-2022 走看看