计算多部分表单帖子的内容长度 [英] Computing the Content Length of a Multipart form Post

查看:102
本文介绍了计算多部分表单帖子的内容长度的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图上传文件而不将其加载到内存中,如下所示。像S3这样的服务需要在这种情况下设置 Content-Length

  package main $ b是否有内置的功能可以做到这一点,或者我必须自己计算它。 
$ b导入(
io
mime / multipart
net / http
os
路径/文件路径


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)
去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
}

任何帮助都将非常感谢。

解决方案

http.Request.Write的文档它表明了/ b


如果Body存在,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


I'm trying to upload a file without loading it into memory, as shown below. Services like S3 need a Content-Length set in such cases. Is there a go-lang built-in to do that, or do I have to compute it myself.

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
}

Any help would be much appreciated.

解决方案

In the docs for http.Request.Write it states

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

Which means if you don't set a Content-Length, http.Request.Write will use chunked transfer encoding. This was added to HTTP/1.1 to get rid of the need to calculate the Content-Length for streaming transfers just like this.

So normally Go programs use chunked encoding and there is no need to set Content-Length. Any modern HTTP stack should support chunked transfer encoding.

However S3 does not support chunked transfer encoding, so I think you'll have to calculate Content-Length yourself.

这篇关于计算多部分表单帖子的内容长度的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆