计算多部分表格帖子的内容长度

时间:2014-05-04 22:20:05

标签: go

我尝试上传文件而不将其加载到内存中,如下所示。在这种情况下,像S3这样的服务需要设置Content-Length。是否有内置的go-lang来做,或者我必须自己计算它。

package main

import (
    "io"
    "mime/multipart"
    "net/http"
    "os"
    "path/filepath"
)

func newfileUploadRequest(uri string, params map[string]string, paramName, path string) (*http.Request, chan error, error) {
    file, err := os.Open(path)
    if err != nil {
        return nil, nil, err
    }
    bodyReader, bodyWriter := io.Pipe()
    multiWriter := multipart.NewWriter(bodyWriter)
    errChan := make(chan error, 1)
    go func() {
        defer bodyWriter.Close()
        defer file.Close()
        part, err := multiWriter.CreateFormFile(paramName, filepath.Base(path))
        if err != nil {
            errChan <- err
            return
        }
        if _, err := io.Copy(part, file); err != nil {
            errChan <- err
            return
        }
        for k, v := range params {
            if err := multiWriter.WriteField(k, v); err != nil {
                errChan <- err
                return
            }
        }
        errChan <- multiWriter.Close()
    }()
    req, err := http.NewRequest("POST", uri, bodyReader)
    return req, errChan, err
}

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:4)

the docs for http.Request.Write中声明

  

如果存在Body,则Content-Length为&lt; = 0且TransferEncoding不具有&t   被设置为&#34; identity&#34;,Write添加&#34;转移编码:chunked&#34;到了   头

这意味着如果您未设置Content-Lengthhttp.Request.Write将使用chunked transfer encoding。这已被添加到HTTP/1.1,以便无需像这样计算流式传输的Content-Length

通常Go程序使用分块编码,不需要设置Content-Length。任何现代HTTP堆栈都应支持分块传输编码。

然而S3 does not support chunked transfer encoding,所以我认为您必须自己计算Content-Length