找了下 golang 发送文件的例子都是二进制流,都试了下,发现 php 接收不到
1
insert000 2022-10-23 20:07:10 +08:00
POST 请求 :file_get_contents('php://input');
|
2
v2016 OP @insert000
我 golang 这样写,php 端使用'php://input'接收到的依旧为空 func postFile(){ //这是一个 Post 参数会被返回的地址 strinUrl:="http://localhost:8080/aaa" byte,err:=ioutil.ReadFile("post.txt") resopne,err :=http.Post(strinUrl,"multipart/form-data",bytes.NewReader(byte)) if err !=nil { fmt.Println("err=",err) } defer func() { resopne.Body.Close() fmt.Println("finish") }() body,err:=ioutil.ReadAll(resopne.Body) if err!=nil { fmt.Println(" post err=",err) } fmt.Println(string(body)) } |
3
eason1874 2022-10-23 20:56:30 +08:00
https://www.php.net/manual/en/wrappers.php.php
php://input is not available with enctype="multipart/form-data". 是不是这个原因? |
4
iyaozhen 2022-10-23 21:23:42 +08:00
@v2016 你这个提交的不符合 http 规范吧
https://juejin.cn/post/6996901713122852895 四种常见的 POST 提交数据方式 你要内容直接放 body 体就不要用 multipart/form-data |
5
Great233 2022-10-24 10:17:33 +08:00
试了下 go1.19.2 PHP8.1 ,按照你的写法 PHP 直接 `file_get_contents('php://input');` 是可以获取到内容的,但是 PHP 报了一条 Warning:Missing boundary in multipart/form-data POST data in Unknown on line 0 。
对于你的问题,go 可以用 `mime/multipart` 包来组装 post body: ``` var buf bytes.Buffer w := multipart.NewWriter(&buf) defer w.Close() fileWriter, _ := w.CreateFormFile("file", "./post.txt") fd, _ := os.Open("./post.txt") defer fd.Close() io.Copy(fileWriter, fd) resopne, err := http.Post(strinUrl, w.FormDataContentType(), &buf) ``` PHP 使用 $_FILES 接收 |