
本文详解如何使用 PHP cURL 正确提交包含文件上传和重复键名数组字段(如 colours[])的 multipart/form-data 表单,解决 Array to string conversion 和 415 Unsupported Media Type 常见错误。
本文详解如何使用 php curl 正确提交包含文件上传和重复键名数组字段(如 `colours[]`)的 multipart/form-data 表单,解决 `array to string conversion` 和 `415 unsupported media type` 常见错误。
在 PHP 中通过 cURL 模拟 curl -F 多部分表单提交时,若需同时上传文件并传递数组型字段(如 colours[]="red"、colours[]="yellow"),直接传入 PHP 索引数组(如 'colours' => ['red','yellow','blue'])会导致 Array to string conversion 错误——因为 cURL 不支持将嵌套数组自动展开为多个同名字段。
根本原因在于:cURL 的 CURLOPT_POSTFIELDS 接收数组时,会将每个键值对作为独立表单字段处理;但 PHP 数组不允许重复键名,因此无法直接表达 colours[]=red&colours[]=yellow&colours[]=blue 这一语义。
✅ 正确做法是显式展开数组为带数字索引的字符串键,利用表单解析器(如 PHP 的 $_POST['colours'])对 colours[0]、colours[1] 等自动聚合成数组的能力:
向CurlShip提交产品,这是一个对机器人友好的SaaS目录。只需一条curl命令即可发布产品,支持OG标签抓取、带徽章的dofollow链接及层级升级。
$url = 'https://the.url.com/upload';
$file = '/path/to/the/file';
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 确保返回响应内容
curl_setopt($ch, CURLOPT_POSTFIELDS, [
'file' => curl_file_create($file), // PHP 5.5+,注意路径必须真实存在
'colours[0]' => 'red',
'colours[1]' => 'yellow',
'colours[2]' => 'blue',
]);
// 可选:设置超时与错误处理
curl_setopt($ch, CURLOPT_TIMEOUT, 30);
curl_setopt($ch, CURLOPT_FAILONERROR, true);
$response = curl_exec($ch);
if (curl_errno($ch)) {
throw new RuntimeException('cURL error: ' . curl_error($ch));
}
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
echo "HTTP Status: {$httpCode}\n";
echo "Response: {$response}\n";⚠️ 关键注意事项:
立即学习“PHP免费学习笔记(深入)”;
- curl_file_create() 要求 PHP ≥ 5.5.0,且文件路径必须可读;若使用旧版本,请改用 @/full/path(已弃用,不推荐);
- 切勿对 CURLOPT_POSTFIELDS 使用 http_build_query() —— 它会生成 application/x-www-form-urlencoded 格式,丢失文件二进制流和 multipart/form-data 边界,导致服务端返回 415 Unsupported Media Type;
- 字段名中的 [0]、[1] 是标准约定,兼容绝大多数后端框架(包括 PHP、Node.js、Python Flask/Django 等),服务端会自动合并为数组;
- 若需动态构建数组字段,可用 array_walk() 或 foreach 生成键值对:
$colours = ['red', 'yellow', 'blue']; $postFields = ['file' => curl_file_create($file)]; foreach ($colours as $index => $colour) { $postFields["colours[{$index}]"] = $colour; } curl_setopt($ch, CURLOPT_POSTFIELDS, $postFields);
总结:cURL 不支持原生数组字段语法,必须手动展开为 key[0]、key[1] 形式。只要确保 CURLOPT_POSTFIELDS 传入关联数组(非 URL 编码字符串),cURL 就会自动设置正确的 Content-Type: multipart/form-data; boundary=...,完整保留文件二进制数据与所有文本字段。


















