为什么我不能使用"文件"作为"身体"一个http请求?

时间:2015-07-27 09:52:46

标签: file http post go

" http.Post"期待一个"读者"作为身体的论点。 "文件"实现"读者"。 但是如果我将文件作为body参数传递,我总是在另一端收到0个字节。为什么?

以下是代码:

package main

import (
    "fmt"
    "net/http"
    "os"
)

func main() {
    file, err := os.Open("lala.txt")
    if err != nil {
        fmt.Printf("file open errrrr %v \n", err)
    }
    defer file.Close()

    resp, err := http.Post("http://requestb.in/11fta851", "text/plain", file)
    if err != nil {
        fmt.Printf("errrrr %v \n", err)
    } else {
        fmt.Printf("resp code %d \n", resp.StatusCode)
    }
}

我知道你可以做" file.ReadAll"到缓冲区并使用它。但感觉就像是双重工作。

1 个答案:

答案 0 :(得分:1)

如果未指定标头Content-Length,则网站requestb.in似乎会忽略POST数据。此代码有效:

package main

import (
    "fmt"
    "net/http"
    "os"
)

func main() {
    file, err := os.Open("lala.txt")
    if err != nil {
        fmt.Printf("file open errrrr %v \n", err)
    }
    defer file.Close()

    req, _ := http.NewRequest("POST", "http://requestb.in/1fry3jy1", file)
    req.ContentLength = 5
    resp, err := http.DefaultClient.Do(req)
    if err != nil {
        fmt.Printf("errrrr %v \n", err)
    } else {
        fmt.Printf("resp code %d \n", resp.StatusCode)
    }
}