分享
这是一个创建于 的主题,其中的信息可能已经有所发展或是发生改变。
~~~
func postFile(filename string, targetURL string) error {
bodyBuf := &bytes.Buffer{}
bodyWriter := multipart.NewWriter(bodyBuf)//这一步不是很懂??
//关键的一步操作
_, err := bodyWriter.CreateFormFile("file", filename)
len := len(bodyBuf.Bytes())
buf1 := &bytes.Buffer{}
buf1.Write(bodyBuf.Bytes()[0:len])//这是什么在干什么???
bodyWriter.Close()
buf2 := &bytes.Buffer{}
buf2.Write(bodyBuf.Bytes()[len:]) //这样不会是空的吗??
//打开文件句柄操作
fh, err := os.Open(filename)
if err != nil {
flog.LOG_ERROR("can not opening file")
return err
}
defer fh.Close()
contentType := bodyWriter.FormDataContentType()
mr := io.MultiReader(buf1, fh, buf2) //将其串联
//mr := io.MultiReader(buf1, fh, buf2)
resp, err := http.Post(targetURL, contentType, mr)
if err != nil {
return err
}
defer resp.Body.Close()
if resp.StatusCode != 200 {
return nil
}
return nil
}
~~~
~~~
func HttpPost(targetUrl string, filename string) error {
bodyBuf := &bytes.Buffer{}
bodyWriter := multipart.NewWriter(bodyBuf)
//关键的一步操作
fileWriter, err := bodyWriter.CreateFormFile("file", filename) //创建表头
if err != nil {
fmt.Println("error writing to buffer")
return err
}
//fmt.Println("url:", targetUrl)
//打开文件句柄操作
fh, err := os.Open(filename)
if err != nil {
fmt.Println("error opening file")
return err
}
_, err = io.Copy(fileWriter, fh)
if err != nil {
return err
}
contentType := bodyWriter.FormDataContentType()//得到类型
bodyWriter.Close()
//bodyBuf
resp, err := http.Post(targetUrl, contentType, bodyBuf)
if err != nil {
fmt.Println(err)
return err
}
defer resp.Body.Close()
resp_body, err := ioutil.ReadAll(resp.Body)
if err != nil {
return err
}
fmt.Println(resp.Status)
fmt.Println(string(resp_body))
return nil
}
~~~
第一段代码比第二段怎么快这么多???
第一段代码buf1、buf2是干什么的
有疑问加站长微信联系(非本文作者)
入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889
关注微信3516 次点击
添加一条新回复
(您需要 后才能回复 没有账号 ?)
- 请尽量让自己的回复能够对别人有帮助
- 支持 Markdown 格式, **粗体**、~~删除线~~、
`单行代码` - 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
- 图片支持拖拽、截图粘贴等方式上传