Golang模拟客户端上传文件(附带常规参数)

今天讲讲Golang如何模拟客户端上传文件,并附带常规的参数。

博主写的http客户端请求库:https://github.com/Albert-Zhan/httpc

package main

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

func main()  {
	//创建一个缓冲区对象,后面的要上传的body都存在这个缓冲区里
	bodyBuf := &bytes.Buffer{}
	bodyWriter := multipart.NewWriter(bodyBuf)
	//要上传的文件
	file1:="./test.jpg"
	file2:="./test2.jpg"
	//创建第一个需要上传的文件,filepath.Base获取文件的名称
	fileWriter1,_:=bodyWriter.CreateFormFile("image_file1",filepath.Base(file1))
	//打开文件
	fd1,_:=os.Open(file1)
	defer fd1.Close()
	//把第一个文件流写入到缓冲区里去
	_,_=io.Copy(fileWriter1,fd1)
	//这里必须复制完后再创建一个文件
	fileWriter2,_:=bodyWriter.CreateFormFile("image_file2",filepath.Base(file2))
	fd2,_:=os.Open(file2)
	defer fd2.Close()
	_,_=io.Copy(fileWriter2,fd2)
	//这一句写入附加字段必须在_,_=io.Copy(fileWriter,fd)后面
	if len(param)!=0 {
		//param是一个一维的map结构
		for k,v:=range param {
			bodyWriter.WriteField(k,v)
		}
	}
	//获取请求Content-Type类型,后面有用
	contentType:=bodyWriter.FormDataContentType()
	bodyWriter.Close()
	//创建一个http客户端请求对象
	client:=&http.Client{}
	//请求url
	url:="http://www.baidu.com"
	//创建一个post请求
	req,_:=http.NewRequest("POST",url,nil)
	//设置请求头
	req.Header.Set("User-Agent","Mozilla/5.0 (Windows NT 6.3; WOW64; rv:47.0) Gecko/20100101 Firefox/47.0")
	//这里的Content-Type值就是上面contentType的值
	req.Header.Set("Content-Type",contentType)
	//转换类型
	req.Body=ioutil.NopCloser(bodyBuf)
	//发送数据
	data,_:=client.Do(req)
	//读取请求返回的数据
	bytes,_:=ioutil.ReadAll(data.Body)
	defer data.Body.Close()
	//打印数据
	fmt.Println(string(bytes))
}

Comments : 0

有问题可在下面发表评论,当然没事也可以在下面吹吹牛皮、扯扯淡!

发表评论

*


Warning: Cannot modify header information - headers already sent by (output started at /www/wwwroot/blog/content/templates/Bitter/footer.php:40) in /www/wwwroot/blog/include/lib/view.php on line 23