PHP中cURL调用file_get_contents始终返回空值问题排查
问题分析与解决方案
嘿,我来帮你搞定这个问题!你当前的cURL代码是在以multipart/form-data的表单格式发送请求,而不是像Paw/Postman那样直接把文件内容作为请求体的原始数据发送——这就是为什么file_get_contents('php://input')拿不到内容的关键原因。
下面分两种场景给出对应的修复方案,你可以根据后端的实际接收逻辑选择:
场景1:后端期望直接接收原始文件内容(和Paw测试效果一致)
从你描述的情况看,这应该是你需要的方案:后端通过php://input获取纯文件内容,说明请求体本身就是文件数据,而非表单编码后的内容。
修改后的代码如下:
$target_url = 'http://my-document-handling-service.net:8000/documents'; $filePath = '/Users/xxxxxxx-xxxx/Documents/kitten-test-upload-image-1.jpg'; // 先读取文件内容 $fileContent = file_get_contents($filePath); if ($fileContent === false) { die('Failed to read file'); } $request = curl_init($target_url); curl_setopt($request, CURLOPT_POST, true); curl_setopt($request, CURLOPT_RETURNTRANSFER, true); curl_setopt($request, CURLOPT_POSTREDIR, 3); // 直接把文件内容作为POST请求的主体 curl_setopt($request, CURLOPT_POSTFIELDS, $fileContent); // 设置匹配文件类型的Content-Type头,图片这里用image/jpeg,根据实际文件调整 curl_setopt($request, CURLOPT_HTTPHEADER, [ 'Content-Type: image/jpeg', 'Content-Length: ' . strlen($fileContent) ]); echo curl_exec($request); curl_close($request);
这样发送请求后,后端的file_get_contents('php://input')就能拿到和Paw里完全一致的图片编码内容了。
场景2:后端期望接收multipart/form-data表单上传
如果你其实是想模拟表单上传(比如后端原本用$_FILES['file']处理文件),那你的原代码错误在于没有正确指定cURL的文件上传格式。PHP 5.5及以上推荐使用CURLFile类(替代旧版的@前缀语法):
$target_url = 'http://my-document-handling-service.net:8000/documents'; $filePath = '/Users/xxxxxxx-xxxx/Documents/kitten-test-upload-image-1.jpg'; // 创建CURLFile对象,指定文件路径、MIME类型和文件名 $file = new CURLFile($filePath, 'image/jpeg', 'kitten-test.jpg'); $request = curl_init($target_url); curl_setopt($request, CURLOPT_POST, true); curl_setopt($request, CURLOPT_RETURNTRANSFER, true); curl_setopt($request, CURLOPT_POSTREDIR, 3); // 将CURLFile对象作为表单字段的值传入 curl_setopt($request, CURLOPT_POSTFIELDS, [ 'file' => $file ]); echo curl_exec($request); curl_close($request);
这种情况下,后端需要用$_FILES['file']来获取上传的文件,而php://input里的内容是multipart/form-data的编码数据,并非纯图片内容。
内容的提问来源于stack exchange,提问作者mikelovelyuk
相关产品推荐
相关产品推荐

