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

PHP CURL实现含图片与数组的Multipart POST请求遇阻求助

解决PHP CURL发送带图片+数组的Multipart请求问题

我太懂这种Postman能跑、自己写代码就翻车的痛苦了!大概率是几个细节没处理对,比如Content-Type的设置、数组参数的编码,或者CurlFile的用法。下面给你一步步搞定:

先避坑:最容易错的两个点

  • 绝对不要手动设置Content-Type: multipart/form-data:CURL会自动生成带正确边界符(boundary)的请求头,手动设置会覆盖掉这个边界符,服务器根本解析不了你的请求体
  • 别用旧的@符号传文件:PHP 5.5+已经废弃这种写法,必须用CurlFile类,不然PHP 7+直接报错

完整可运行的代码示例

我把关键部分都标出来了,你对应替换成自己的参数就行:

// 你的认证token
$auth_token = "这里填你的Authorization-token值";

// 1. 处理图片:正确实例化CurlFile
$image_path = "/绝对路径/到你的图片.jpg";
// 自动获取MIME类型,比硬写image/jpeg更靠谱
$image_mime = mime_content_type($image_path);
// 第三个参数是表单里的文件名(对应Postman里的「文件名称」)
$image_file = new CurlFile($image_path, $image_mime, "自定义文件名.jpg");

// 2. 准备图片详情数组:根据API要求调整格式
$image_details = [
    "title" => "春日花海",
    "tags" => ["鲜花", "户外"],
    "description" => "这是今年春天在郊外拍的油菜花田"
];

// 3. 构建POST数据:分两种情况处理数组
$post_data = [
    "image" => $image_file, // 对应Postman里的文件字段名
    // 情况1:API期望details是表单数组(比如Postman里是details[title]这种格式),直接传数组
    // "details" => $image_details,
    // 情况2:API期望details是JSON字符串,就转成JSON
    "details" => json_encode($image_details),
    // 情况3:如果API要求用query格式的字符串,就用http_build_query
    // "details" => http_build_query($image_details, '', '&', PHP_QUERY_RFC1738)
];

// 4. 初始化并配置CURL
$ch = curl_init();

curl_setopt_array($ch, [
    CURLOPT_URL => "你的API接口地址",
    CURLOPT_RETURNTRANSFER => true, // 把响应内容返回成字符串,而不是直接输出
    CURLOPT_POST => true,
    CURLOPT_POSTFIELDS => $post_data,
    // 关键:只传认证头,不要加Content-Type!
    CURLOPT_HTTPHEADER => [
        'Authorization-token: ' . $auth_token
    ],
    // 调试用:打开这个可以把请求日志写到文件里,方便和Postman对比
    // CURLOPT_VERBOSE => true,
    // CURLOPT_STDERR => fopen('curl_debug.log', 'w')
]);

// 5. 执行请求并处理结果
$response = curl_exec($ch);
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);

if(curl_errno($ch)) {
    echo "CURL出错了:" . curl_error($ch);
} else {
    echo "响应状态码:" . $http_code . "<br>";
    echo "响应内容:" . $response;
}

curl_close($ch);

怎么和Postman对比找问题?

Postman有个超好用的功能:右上角点「代码」按钮,选择「PHP - cURL」,它会自动生成对应的PHP代码。你把生成的代码和自己的代码对比,重点看:

  • 文件字段的命名和CurlFile的参数
  • 数组参数的传递方式(是直接传数组、JSON还是query字符串)
  • 请求头里有没有多余的Content-Type设置

这样一对比,就能快速找到哪里不一样了!

内容的提问来源于stack exchange,提问作者Tuxino

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:15:35