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