简体   繁体   English

多部分请求上传文件和 JSON 消息

[英]Multipart request upload file and JSON message

How to implement a curl request in a go program如何在 go 程序中实现 curl 请求

curl -XPOST -H 'Authorization: Bearer ***API*KEY***' http://127.0.0.1:9000/api/case/task/AVqqeXc9yQ6w1DNC8aDj/log -F '_json={"message": "Screenshot of fake site"};type=application/json' -F 'attachment=@screenshot1.png;type=image/png'

I tried to do something similar, but my knowledge is probably not enough我试图做类似的事情,但我的知识可能还不够

func CreateAttachedTask(caseid string, filename string, tasktitle string, taskdescription string, baseURL string, token string) {
fileDir, _ := os.Getwd()
    filePath := path.Join(fileDir, filename)

    file, err := os.Open(filePath)
    defer file.Close()
    buffer := new(bytes.Buffer)
    writer := multipart.NewWriter(buffer)
    part, _ := writer.CreateFormFile("filename", filepath.Base(file.Name()))
    io.Copy(part, file)
    writer.WriteField("_json", `{"message":"Screenshot of fake site"}`)
    defer writer.Close()
    req, err = http.NewRequest("POST", "http://127.0.0.1:9000/api/case/task/AVqqeXc9yQ6w1DNC8aDj/log", buffer)
    if err != nil {
        log.Fatal(err.Error())
    }
    req.Header.Set("Authorization", token)
    req.Header.Set("Content-Type", writer.FormDataContentType())

    client = &http.Client{Transport: defaultTtransportObs}
    resp, err = client.Do(req)
    if err != nil {
        panic(err)
    }
    fmt.Println("Log response Status:", resp.Status)
    defer resp.Body.Close()
}

Here is the solution这是解决方案

var b bytes.Buffer
w := multipart.NewWriter(&b)
file, err := os.Open(filename)

req.Header.Set("Authorization", token)

h := make(textproto.MIMEHeader) 
h.Set("Content-Type", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")
h.Set("Content-Disposition", fmt.Sprintf(`form-data; name="attachment"; filename="%s"`, filename))
fileWriter, err := w.CreatePart(h)
if err != nil {
    fmt.Println(err)
}
io.Copy(fileWriter, file)
w.WriteField("_json", `{"message":"Attach:"}`)
w.Close()

req, err = http.NewRequest("POST", "http://127.0.0.1:9000/api/case/task/AVqqeXc9yQ6w1DNC8aDj/log", &b)
if err != nil {
    log.Fatal(err.Error())
}
req.Header.Set("Content-Type", w.FormDataContentType())
req.Header.Set("Authorization", token)

res, err := client.Do(req)
if err != nil {
    log.Fatal(err.Error())
}

if res.StatusCode != http.StatusOK {
    err = fmt.Errorf("bad status: %s", res.Status)
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM