~~~
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是干什么的
~~~
func postFile(filename string, targetURL string) error {
star := time.Now() //得到时间
bodyBuf := &bytes.Buffer{}
bodyWriter := multipart.NewWriter(bodyBuf) //NewWriter函数返回一个设定了一个随机边界的Writer,数据写入w。
//关键的一步操作
//CreateFormFile是CreatePart方法的包装, 使用给出的属性名和文件名创建一个新的form-data头。
_, 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:]) //将尾部写入到buf2中
//打开文件句柄操作
fh, err := os.Open(filename)
if err != nil {
fmt.Println("can not opening file")
return err
}
defer fh.Close()
contentType := bodyWriter.FormDataContentType()
mr := io.MultiReader(buf1, fh, buf2) //将其串联,使待发送部分在随机边界内
resp, err := http.Post(targetURL, contentType, mr)
if err != nil {
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))
if resp.StatusCode != 200 {
return nil
}
delta := time.Since(star)
addRunTime(int64(delta))
return nil
}
~~~
第一段代码比第二段怎么快,因为第二段有一个多了个拷贝
_, err = io.Copy(fileWriter, fh)
#3