go - 当(HTTP)通过将 io.Reader 从 os.Open 传递到 http.Post 来发布本地文件时,Content-Length 为零

标签 go

大家好:有一个简短的问题,我想发布 (http) 一个文件。我想,因为 os.Open 返回一个 io.Reader 而 http.Post 需要一个 io.Reader 我没有在单独的步骤中将文件读入内存并且可以绕过 Reader。 但是,Content-Length 将设置为零 - 这有点道理,但不是我需要的。

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 获取它来设置 Content-Length,但我想知道是否有更优雅的方法来做到这一点?

最佳答案

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

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

另请注意,根据 http.Request.Write() documentation (我引用):

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

因此在那种情况下,客户本身会为您做(可以说)最明智的事情。

关于go - 当(HTTP)通过将 io.Reader 从 os.Open 传递到 http.Post 来发布本地文件时,Content-Length 为零,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41378605/

相关文章:

go - 模块 heptio/workgroup 移至 projectcontour/contour/internal/workgroup

go - 如何在 Go 中执行三叉树的深拷贝?

go - 如何获得时间。滴答立即滴答

go - Go中如何实现依赖注入(inject)

dictionary - 在 go 结构中初始化深度映射嵌套

android - 在 Android 上使用网络

go - 如何解析yaml并获取接口(interface)深层结构的值(value)

amazon-web-services - AWS S3 上传的文件未显示

go - 在一个goroutine中将项目添加到 channel ,在另一个goroutine中进行处理

go - 两种不同语言之间的 Protocol Buffer