gpt4 book ai didi

go - 计算多部分表单的内容长度

转载 作者:IT王子 更新时间:2023-10-29 01:37:03 27 4
gpt4 key购买 nike

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

如有任何帮助,我们将不胜感激。

最佳答案

the docs for http.Request.Write它指出

If Body is present, Content-Length is <= 0 and TransferEncoding hasn't been set to "identity", Write adds "Transfer-Encoding: chunked" to the header

这意味着如果您不设置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

关于go - 计算多部分表单的内容长度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23462230/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com