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

2024-02-12

我正在尝试上传文件而不将其加载到内存中,如下所示。像 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
}

任何帮助将非常感激。


In http.Request.Write 的文档 http://golang.org/pkg/net/http/#Request.Write它指出

如果 Body 存在,Content-Length

这意味着如果您没有设置Content-Length, http.Request.Write将使用分块传输编码 http://en.wikipedia.org/wiki/Chunked_transfer_encoding。这被添加到HTTP/1.1摆脱计算的需要Content-Length对于像这样的流传输。

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

However S3不支持分块传输编码 http://aws.amazon.com/articles/1109#14,所以我想你必须计算Content-Length你自己。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

计算多部分表单帖子的内容长度 的相关文章

随机推荐