为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
宝慕林4294392 2021-07-07 13:46:51
我正在尝试使用 go 将图像从我的计算机上传到网站。通常,我使用 bash 脚本向服务器发送文件和密钥:curl -F "image"=@"IMAGEFILE" -F "key"="KEY" URL它工作正常,但我正在尝试将此请求转换为我的 golang 程序。http://matt.aimonetti.net/posts/2013/07/01/golang-multipart-file-upload-example/我尝试了这个链接和许多其他链接,但是,对于我尝试的每个代码,来自服务器的响应是“没有发送图像”,我不知道为什么。如果有人知道上面的例子发生了什么。
查看完整描述

3 回答

?
慕哥6287543

TA贡献1831条经验 获得超10个赞

这是一些示例代码。

简而言之,您需要使用该mime/multipart来构建表单。

package main


import (

    "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

}


查看完整回答
反对 回复 2021-07-12
  • 3 回答
  • 0 关注
  • 404 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信