使用 Content-Type multipart/form-data POST 数据

我正在尝试使用 go 将图像从我的计算机上传到网站。通常,我使用 bash 脚本向服务器发送文件和密钥:

curl -F "image"=@"IMAGEFILE" -F "key"="KEY" URL

它工作正常,但我正在尝试将此请求转换为我的 golang 程序。

http://matt.aimonetti.net/posts/2013/07/01/golang-multipart-file-upload-example/

我尝试了这个链接和许多其他链接,但是,对于我尝试的每个代码,来自服务器的响应是“没有发送图像”,我不知道为什么。如果有人知道上面的例子发生了什么。


宝慕林4294392
浏览 405回答 3
3回答

慕哥6287543

这是一些示例代码。简而言之,您需要使用该mime/multipart包来构建表单。package mainimport (    "bytes"    "fmt"    "io"    "mime/multipart"    "net/http"    "net/http/httptest"    "net/http/httputil"    "os"    "strings")func main() {    var client *http.Client    var remoteURL string    {        //setup a mocked http client.        ts := httptest.NewTLSServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {            b, err := httputil.DumpRequest(r, true)            if err != nil {                panic(err)            }            fmt.Printf("%s", b)        }))        defer ts.Close()        client = ts.Client()        remoteURL = ts.URL    }    //prepare the reader instances to encode    values := map[string]io.Reader{        "file":  mustOpen("main.go"), // lets assume its this file        "other": strings.NewReader("hello world!"),    }    err := Upload(client, remoteURL, values)    if err != nil {        panic(err)    }}func Upload(client *http.Client, url string, values map[string]io.Reader) (err error) {    // Prepare a form that you will submit to that URL.    var b bytes.Buffer    w := multipart.NewWriter(&b)    for key, r := range values {        var fw io.Writer        if x, ok := r.(io.Closer); ok {            defer x.Close()        }        // Add an image file        if x, ok := r.(*os.File); ok {            if fw, err = w.CreateFormFile(key, x.Name()); err != nil {                return            }        } else {            // Add other fields            if fw, err = w.CreateFormField(key); err != nil {                return            }        }        if _, err = io.Copy(fw, r); err != nil {            return err        }    }    // Don't forget to close the multipart writer.    // If you don't close it, your request will be missing the terminating boundary.    w.Close()    // Now that you have a form, you can submit it to your handler.    req, err := http.NewRequest("POST", url, &b)    if err != nil {        return    }    // Don't forget to set the content type, this will contain the boundary.    req.Header.Set("Content-Type", w.FormDataContentType())    // Submit the request    res, err := client.Do(req)    if err != nil {        return    }    // Check the response    if res.StatusCode != http.StatusOK {        err = fmt.Errorf("bad status: %s", res.Status)    }    return}func mustOpen(f string) *os.File {    r, err := os.Open(f)    if err != nil {        panic(err)    }    return r}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go