如何写图像来请求身体

时间:2014-07-11 16:51:18

标签: go

我有一个jpeg image.Image,我想decode到请求正文。简化如下,它似乎无法完成请求。该程序挂起。

  r, w := io.Pipe()
  jpeg.Encode(w, img, &jpeg.Options{ 80 })

  req, e := http.NewRequest("PUT", myUrl, r)
  if e != nil {
    return nil, e
  }
  http.DefaultClient.Do(req)

如何将图像写入请求正文?

2 个答案:

答案 0 :(得分:2)

只需使用缓冲区

var w bytes.Buffer

jpeg.Encode(&w, img, &jpeg.Options{80})

req, e := http.NewRequest("PUT", myUrl, &w)
if e != nil {
    log.Fatal(e)
}
http.DefaultClient.Do(req)

答案 1 :(得分:1)

jpeg.Encode无法进行,因为它阻止写入管道(管道不缓冲)。

您需要缓冲编码图像,或同时运行Encode和http请求。

// make sure to buffer this channel, so the goroutine can exit if we return early
errChan := make(chan error, 1)

r, w := io.Pipe()
go func() {
    errChan <- jpeg.Encode(w, img, &jpeg.Options{80})
}()

req, err := http.NewRequest("PUT", myUrl, r)
if err != nil {
    return nil, err
}
err := http.DefaultClient.Do(req)
if err != nil {
    return nil, err
}

// check for an encoding error
err := <-errChan
if err != nil {
    return nil, err
}