今天讲讲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