Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Go:http文件上载_Http_Curl_File Upload_Go - Fatal编程技术网

Go:http文件上载

Go:http文件上载,http,curl,file-upload,go,Http,Curl,File Upload,Go,我正试图上传一个文件作为附件从一个客户端编写的围棋。 我正在使用http多部分CreateFormFile。当我这样做时,它将正文中的数据发送到服务器拒绝的服务器 file, err := os.Open(*img.Filepath) if err != nil { return err } defer file.Close() body := &bytes.Buffer{} writer := multipart.NewWriter(body) part, err := w

我正试图上传一个文件作为附件从一个客户端编写的围棋。 我正在使用http多部分CreateFormFile。当我这样做时,它将正文中的数据发送到服务器拒绝的服务器

file, err := os.Open(*img.Filepath)
if err != nil {
    return err
}

defer file.Close()

body := &bytes.Buffer{}
writer := multipart.NewWriter(body)
part, err := writer.CreateFormFile("asset", filepath.Base(*img.Filepath))
if err != nil {
    return err
}
_, err = io.Copy(part, file)
if err != nil {
    return err
}

contentType := writer.FormDataContentType()
err = writer.Close()
if err != nil {
    return err
}

request, err := http.NewRequest("POST", API_URL, body)
if err != nil {
    return err
}

request.Header.Set("Content-Type", contentType)

values := request.URL.Query()
values.Add("filename", util.GetFileNameWithoutExtension(*img.FileName))
request.URL.RawQuery = values.Encode()
client := &http.Client{}
resp, err := client.Do(request)
if err != nil {
    return err
} else {
    respBody := &bytes.Buffer{}
    _, err = respBody.ReadFrom(resp.Body)
    if err != nil {
        return err
    }
    resp.Body.Close()
}
当我使用curl尝试同样的方法时,效果很好 curl-X POST-F“asset=@filepath


如何使用Go实现key=@val功能?

最后,我检查了CreateFormFile的代码,内容类型使用mime头硬编码到application/octet流。我自己重新实现了同样的方法,而且效果很好

func CreateFormFile(w *multipart.Writer, fieldname string, filename string)     (io.Writer, error) {
    h := make(textproto.MIMEHeader)
    h.Set("Content-Disposition", fmt.Sprintf(`form-data; name="%s";  filename="%s"`, escapeQuotes(fieldname), escapeQuotes(filename)))
    h.Set("Content-Type", "image/jpeg")
    return w.CreatePart(h)
}

代码演示了你在客户端做什么?我没有看到任何明显的代码;您是否使用诸如charles之类的拦截器或tcpdump捕获了实际的POST请求/响应,并将其与curl生成的请求/响应进行了比较?谢谢您的帮助。我检查了标题,内容类型设置为application/octet-stream。