PHP CURL POST上传文件时$_FILES为空的问题排查
解决PHP CURL POST文件无法进入$_FILES的问题
我来帮你排查这个问题,核心原因主要是字段名称不匹配,再结合几个curl配置细节调整就能解决:
1. 字段名不匹配是核心问题
你的send.php里把文件放在了'file'这个键下,但receive.php里却在找'uploaded_file',这就导致接收端根本找不到对应的上传文件,自然$_FILES['uploaded_file']是空的。
2. 修正send.php的代码
把POST字段的键改成和接收端一致的'uploaded_file',同时确认curl_file_create的路径正确(路径是相对于当前send.php的位置,你写的../path/to/file.txt要确保文件真实存在):
<?php $filedata = curl_file_create('../path/to/file.txt', 'text/plain', 'file.txt'); // 把键名改成uploaded_file,和接收端对应 $array = array( 'uploaded_file' => $filedata ); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, 'https://domain_name.com/url/to/script.php'); curl_setopt($ch, CURLOPT_HEADER, false); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $array); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // PHP 5.5.0+必须开启这个,才能用curl_file_create替代@语法 curl_setopt($ch, CURLOPT_SAFE_UPLOAD, true); $result = curl_exec($ch); curl_close($ch); ?>
3. 优化receive.php的调试与逻辑
先添加调试代码确认$_FILES是否有值,再处理文件:
<?php // 先调试看$_FILES的内容 var_dump($_FILES); if(isset($_FILES['uploaded_file']) && $_FILES['uploaded_file']['error'] === UPLOAD_ERR_OK) { // 检查文件是否真的上传成功 if(is_uploaded_file($_FILES['uploaded_file']['tmp_name'])){ $contents = file_get_contents($_FILES['uploaded_file']['tmp_name']); $data = explode('/',$contents); // 这里可以添加处理后的逻辑,比如返回结果给send.php echo "文件上传成功,内容已处理"; } } else { echo "文件上传失败,错误码:" . $_FILES['uploaded_file']['error'] ?? '未知错误'; } ?>
额外说明
你之前看到$_POST里有uploaded_file的数组,是因为当curl发送的字段名不匹配,或者curl配置有误时,curl_file_create创建的对象会被序列化成数组存入$_POST,而不是以文件上传的形式进入$_FILES。调整字段名后就能正常触发文件上传流程了。
内容的提问来源于stack exchange,提问作者molinet
相关产品推荐
相关产品推荐

