You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过CURL与PHP实现文件上传?上传问题求助

解决PHP通过cURL上传图片POST请求失败的问题

看起来你在处理文件上传的POST请求时踩了几个常见的坑,我帮你梳理一下问题并给出修正后的代码:

主要问题分析

  1. Content-Type头冲突:你同时设置了application/x-www-form-urlencoded和multipart/form-data,这两种格式完全不兼容,文件上传必须用multipart/form-data,而且cURL会自动生成正确的boundary,不需要手动指定。
  2. POST字段格式错误:当使用CurlFile上传文件时,应该直接把CurlFile对象赋值给表单字段(比如uploaded_file),而不是单独提取filename放到数组里。
  3. 不必要的请求头:Postman-Token是Postman工具的专属头,手动添加会导致请求异常;content-length也不需要手动设置,cURL会自动计算正确的长度。
  4. 文件路径验证: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 07:58:21