HTTP-POST 文件多部分

标签 http-post go multipart

我正在尝试使用 Go 包 mime/multipart 和 http 发送多部分表单,我需要一些帮助来解决它。

HTML 将是:


<html>
<head><title>Multipart Test</title></head>
<body>
<form action="/multipart" enctype="multipart/form-data" method="POST">

<label for="file"> Please select a File </label>
<input id="file" type="file" name="file"/>
<br>
<label for="input1"> Please write some text </label>
<input id="input1" type="text" name="input1"/>
<br>
<label for="input2"> Please write some more text </label>
<input id="input2" type="text" name="input2"/>
<br>
<input type="submit" name="Submit" value="Submit"/>
</body>

我的 Go 方法是这样的:


var buffer bytes.Buffer
w := multipart.NewWriter(&buffer)
// Write fields and files
w.CreateFormField("input1")
w.WriteField("input1","value1")
w.CreateFormFile("file","filename.dat")
// I need a Reader to here to read the file, but how ?
// then send the request
resp,err := http.Post(url,w.FormDataContentType(),&buffer)

最佳答案

答案可以在this sample code之后找到

// Upload file to google code
func Upload(tarball string) (err os.Error) {
    // Create buffer
    buf := new(bytes.Buffer) // caveat IMO dont use this for large files, \
    // create a tmpfile and assemble your multipart from there (not tested) 
    w := multipart.NewWriter(buf)
    // Create a form field writer for field label
    label, err := w.CreateFormField("label")
    if err != nil {
        return err
    }
    // Write label field
    label.Write([]byte("label here"))
    // Create a form field writer for field summary
    summary, err := w.CreateFormField("summary")
    if err != nil {
        return err
    }
    // Write summary field
    summary.Write([]byte("summary here"))
    // Create file field
    fw, err := w.CreateFormFile("upload", tarball)
    if err != nil {
        return err
    }
    fd, err := os.Open(tarball)
    if err != nil {
        return err
    }
    defer fd.Close()
    // Write file field from file to upload
    _, err = io.Copy(fw, fd)
    if err != nil {
        return err
    }
    // Important if you do not close the multipart writer you will not have a 
    // terminating boundry 
    w.Close()
    req, err := http.NewRequest("POST", repoUrl, buf)
    if err != nil {
        return err
    }
    req.Header.Set("Content-Type", w.FormDataContentType())
    req.SetBasicAuth("email@email.com", "password")
    res, err := client.Do(req) 
    if err != nil {
        return err
    }
    io.Copy(os.Stderr, res.Body) // Replace this with Status.Code check
    return err
}

关于HTTP-POST 文件多部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7223616/

相关文章:

go - 检测命令是否通过管道传输

algorithm - Go:用于字符串比较的多项式指纹

javascript - Ionic 中的 Angularjs $http 发布错误

php - 如何使用 Android 拍照并发送到 HTTP POST 请求?

javascript - 用于用 JavaScript 解析的 Golang JSON 编码

使用 HTTP POST 上传 PDF 文件的 VBA

python - 使用 python boto 将大文件作为并行多部分上传到 S3/D42

java - 在 Web 服务中使用 JSON 字节数组以及 application/x-www-form-urlencoded

javascript - HTML 表单默认值会覆盖 Internet Explorer 9 中发布时的实际值

spring - 使用 RestTemplate.postForLocation 的文件上传进度条