如何通过CURL与PHP实现文件上传?上传问题求助
解决PHP通过cURL上传图片POST请求失败的问题
看起来你在处理文件上传的POST请求时踩了几个常见的坑,我帮你梳理一下问题并给出修正后的代码:
主要问题分析
- Content-Type头冲突:你同时设置了
application/x-www-form-urlencoded和multipart/form-data,这两种格式完全不兼容,文件上传必须用multipart/form-data,而且cURL会自动生成正确的boundary,不需要手动指定。 - POST字段格式错误:当使用
CurlFile上传文件时,应该直接把CurlFile对象赋值给表单字段(比如uploaded_file),而不是单独提取filename放到数组里。 - 不必要的请求头:
Postman-Token是Postman工具的专属头,手动添加会导致请求异常;content-length也不需要手动设置,cURL会自动计算正确的长度。 - 文件路径验证:
realpath如果找不到文件会返回false,需要先确保文件存在,否则CurlFile无法创建。
修正后的代码
<?php // 先验证文件是否存在 $imagePath = realpath("scorpion_stretch-59788999e4432d80.jpg"); if (!$imagePath) { die("错误:找不到指定的图片文件"); } // 创建CurlFile对象,指定表单字段名对应的文件 $image = new CurlFile($imagePath); // POST字段应该直接把CurlFile对象绑定到对应的表单键上 $postFields = [ "uploaded_file" => $image ]; $curl = curl_init(); curl_setopt_array($curl, [ CURLOPT_URL => "https://resources.diamondappgroup.com/upload.php", CURLOPT_RETURNTRANSFER => true, CURLOPT_ENCODING => "", CURLOPT_MAXREDIRS => 10, CURLOPT_TIMEOUT => 30, CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, CURLOPT_POST => true, // 用CURLOPT_POST代替CUSTOMREQUEST更规范 CURLOPT_POSTFIELDS => $postFields, CURLOPT_HTTPHEADER => [ "Accept: */*", "Connection: keep-alive", "User-Agent: PostmanRuntime/7.11.0", "accept-encoding: gzip, deflate" ], ]); $response = curl_exec($curl); $err = curl_error($curl); curl_close($curl); if ($err) { echo "cURL Error #:" . $err; } else { echo $response; } ?>
额外说明
- 如果你的
makeCurlFile方法是自定义的封装,确保它正确返回CurlFile对象,否则直接用原生的new CurlFile()更可靠。 - 上传文件时,服务器端的
upload.php需要正确处理uploaded_file这个字段,比如用$_FILES['uploaded_file']来获取上传的文件信息。 - 可以在代码里添加
var_dump($image)来验证CurlFile是否创建成功,确认文件路径和MIME类型是否正确。
内容的提问来源于stack exchange,提问作者DaAmidza
相关产品推荐
相关产品推荐

