关于pos请求的疑问??

zhaohao · 2017-03-30 09:20:07 · 3081 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2017-03-30 09:20:07 的主题,其中的信息可能已经有所发展或是发生改变。

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

3081 次点击  
加入收藏 微博
4 回复  |  直到 2017-05-04 01:07:06
zhaohao
zhaohao · #1 · 8年之前

我已经知道了

litpang0924
litpang0924 · #2 · 8年之前
zhaohaozhaohao #1 回复

我已经知道了

可以分享您知道的 ?

zhaohao
zhaohao · #3 · 8年之前
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)

dadafeng
dadafeng · #4 · 8年之前
zhaohaozhaohao #3 回复

~~~ 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)

添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传