Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Go 当(HTTP)通过将io.Reader从os.Open传递到HTTP.Post来发布本地文件时,内容长度为零_Go - Fatal编程技术网

Go 当(HTTP)通过将io.Reader从os.Open传递到HTTP.Post来发布本地文件时,内容长度为零

Go 当(HTTP)通过将io.Reader从os.Open传递到HTTP.Post来发布本地文件时,内容长度为零,go,Go,大家好:有一个简短的问题,我想发布(http)一个文件。我想,由于os.Open返回一个io.Reader,而http.Post接受一个io.Reader,所以我没有在单独的步骤中将文件读入内存,只需将其传递给读取器即可。 但是,内容长度将设置为零-这有点道理,但不是我需要的 file, _ := os.Open("some file") req, _ := http.NewRequest("POST", "some url", file) dump, _ := httputil.DumpReq

大家好:有一个简短的问题,我想发布(http)一个文件。我想,由于os.Open返回一个io.Reader,而http.Post接受一个io.Reader,所以我没有在单独的步骤中将文件读入内存,只需将其传递给读取器即可。 但是,内容长度将设置为零-这有点道理,但不是我需要的

file, _ := os.Open("some file")
req, _ := http.NewRequest("POST", "some url", file)
dump, _ := httputil.DumpRequestOut(req, false)
fmt.Println(string(dump))
我的问题:我是否必须将文件读入内存(使用ioutil.ReadFile或类似的工具)并创建一个新的读取器,或者是否有方法将读取器从文件直接传递到Post请求,而无需执行“读取”步骤


我想我可以通过file.Stat设置内容长度,但我想知道是否有更优雅的方法来实现这一点?

是的,可以传递直接作为HTTP请求主体返回的
os.Open()

但是,只有两种方法可以处理该文件数据的内容长度。它们是不同的,但它们都围绕着这样一个想法,即接收方必须事先知道内容长度,也就是说,在主体收到HTTP响应头之前,接收方必须知道内容长度,或者接收方必须使用允许不知道内容长度的机制,然后发送方必须有一种方式来发出信号,表明发送数据已经完成

  • 即使使用HTTP/1.0,一个“经典”的方法是在发送之前计算它。这确实意味着要么将整个内容读入内存,要么执行
    stat
    调用(顺便说一句,您可以在打开的文件上执行)

  • HTTP/1.1支持它发送的所谓的数据类型。 在这种情况下,有效载荷被切割成若干块,每一块都使用特定的帧依次发送。一个特殊的帧表示数据流的结束。在这种情况下,可以将内容类型设置为0,但客户端必须支持分块编码(并非所有客户端都支持)


简短的回答是:关于将os.File提供给http.Request以及关于使用os.File.Stat()获取文件大小并在http.Request头上设置它,您完全正确。我个人认为这是最简单的方法

i、 e

另请注意,根据(我的报价):

如果存在正文,则内容长度为
file, _ := os.Open("some file")
info, _ := file.Stat()
req, _ := http.NewRequest("POST", "http://bla.com", file)
req.ContentLength = info.Size()
dump, _ := httputil.DumpRequestOut(req, false)
fmt.Println(string(dump))