我正在尝试上传文件而不将其加载到内存中,如下所示。Content-Length在这种情况下,像S3 这样的服务需要一套。是否有内置的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
}
Run Code Online (Sandbox Code Playgroud)
任何帮助将非常感激。
如果存在正文,则Content-Length为<= 0并且TransferEncoding尚未设置为“ identity”,Write将“ Transfer-Encoding:chunked”添加到标题
这意味着如果您不设置的话Content-Length,http.Request.Write将会使用分块的传输编码。这样做是为了HTTP/1.1消除Content-Length像这样计算流传输的需求。
因此,通常Go程序使用分块编码,因此无需进行设置Content-Length。任何现代的HTTP堆栈都应支持分块传输编码。
但是S3不支持分块传输编码,因此我认为您必须Content-Length自己计算。
| 归档时间: |
|
| 查看次数: |
1164 次 |
| 最近记录: |