如何实现 golang 发送文件 PHP 接收文件

2022-10-23 20:04:53 +08:00
 v2016

找了下 golang 发送文件的例子都是二进制流,都试了下,发现 php 接收不到

1034 次点击
所在节点    问与答
5 条回复
insert000
2022-10-23 20:07:10 +08:00
POST 请求 :file_get_contents('php://input');
v2016
2022-10-23 20:11:41 +08:00
@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))
}
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". 是不是这个原因?
iyaozhen
2022-10-23 21:23:42 +08:00
@v2016 你这个提交的不符合 http 规范吧

https://juejin.cn/post/6996901713122852895 四种常见的 POST 提交数据方式

你要内容直接放 body 体就不要用 multipart/form-data
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 接收

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/889172

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX