在POST请求中将图像作为主体附加到golang服务器

时间:2016-02-05 07:42:40

标签: javascript jquery go

我有一个本地golang服务器,其端点可以监听POST请求,解码请求的主体并保留它。这在我手动卷曲端点时起作用,如

    curl -X POST localhost:8080/newimage --data-binary "PATH"

但是,我在通过我正在处理的gui成功上传POST请求中的文件时遇到问题。我正在使用https://github.com/okonet/react-dropzone删除File并将其附加到FormData对象,但golang服务器似乎没有收到填充的正文。

这就是我创建AJAX查询的方式:

    formData = new FormData();
    formData.append("image", file)
    $.ajax({
        url: "http://localhost:8080/items/81d648b0-25f9-434e-9129-fe52575865dd/newimage",
        type: "POST",
        data: formData,
        processData: false
    }).done(function(res) {
        console.log(res);
    });

后端服务器:

func (h *ItemHandler) PostImage(resp http.ResponseWriter, req *http.Request) {
vars := mux.Vars(req)
itemID := vars["id"]
assetID := newAssetID()

// verify image
img, _, err := image.Decode(req.Body)
if err != nil {
    log.Printf("could not decode body into an image")
    resp.Header().Add("Access-Control-Allow-Origin", "*")
    resp.WriteHeader(http.StatusBadRequest)
    resp.Write([]byte("could not decode body image"))
    return
}

感谢任何建议。

1 个答案:

答案 0 :(得分:0)

FormData与将图像作为原始字节发送非常不同。 以下是如何从multipart / form-data请求中获取文件的示例:

func (h *ItemHandler) PostImage(resp http.ResponseWriter, req *http.Request) {
  vars := mux.Vars(req)
  itemID := vars["id"]
  assetID := newAssetID()

  file, _, err := req.FormFile("image")
  if err != nil{
    log.Print(err)
    resp.WriteHeader(http.StatusBadRequest)
    return
  }

  // verify image
  img, _, err := image.Decode(file)
  if err != nil {
    log.Printf("could not decode body into an image")
    resp.Header().Add("Access-Control-Allow-Origin", "*")
    resp.WriteHeader(http.StatusBadRequest)
    resp.Write([]byte("could not decode body image"))
    return
  }
  ...
}

请参阅https://golang.org/pkg/net/http/#Request.FormFile