使用curl无表单POST上传文件至PHP服务报错,如何解决?
问题解答
PHP默认的$_FILES数组仅支持解析multipart/form-data编码的HTTP上传请求(也就是HTML表单提交的标准格式),你使用curl -T发送的是Raw格式的POST/PUT请求,这种请求不会被PHP解析到$_FILES中,因此现有代码会因访问未定义的$_FILES['userfile']触发内部错误。
解决方法
方法1:适配现有PHP代码(推荐)
使用curl模拟表单上传格式,命令如下:
curl -X POST -F "userfile=@/tmp/image.png" https://web-server-host/upload.php
-F参数会自动将请求编码为multipart/form-datauserfile=@/tmp/image.png指定上传字段名(对应PHP中的$_FILES['userfile'])和本地文件路径- 现有
upload.php无需修改即可正常运行
方法2:修改PHP代码支持Raw上传
如果一定要使用curl -T的方式,需要修改PHP代码直接读取请求体内容:
<?php $uldir = '/tmp/repos/'; // 可自定义文件名,或从请求头/参数中获取 $ulfile = $uldir . basename('image.png'); // 读取原始请求体数据 $rawContent = file_get_contents('php://input'); if (file_put_contents($ulfile, $rawContent)) { echo "Uploaded successfully.\n"; } else { echo "Could not upload file!\n"; } ?>
对应的curl命令保持不变:
curl -X POST -T /tmp/image.png https://web-server-host/upload.php # 或使用PUT方法 curl -X PUT -T /tmp/image.png https://web-server-host/upload.php
内容的提问来源于stack exchange,提问作者sidman
相关产品推荐
相关产品推荐

