
本文详解如何使用 PHP cURL 同时上传文件并提交包含重复键名的数组字段(如 colours[]),解决 Array to string conversion 错误及 415 Unsupported Media Type 问题,确保服务端正确接收 multipart 表单数据。
本文详解如何使用 php curl 同时上传文件并提交包含重复键名的数组字段(如 `colours[]`),解决 `array to string conversion` 错误及 `415 unsupported media type` 问题,确保服务端正确接收 multipart 表单数据。
在 PHP 中通过 cURL 提交含文件上传和数组字段的表单时,常见误区是直接将 PHP 数组(如 'colours' => ['red','yellow','blue'])作为 CURLOPT_POSTFIELDS 的值——这会触发 Array to string conversion 致命错误,因为 cURL 不支持嵌套/多维数组自动展开为 name[]=val1&name[]=val2 格式。
关键原理在于:cURL 的 CURLOPT_POSTFIELDS 接收数组时,会自动以 multipart/form-data 方式编码,但数组键必须是字符串形式的“带索引的字段名”,而非 PHP 原生数组。服务端(如 PHP-FPM 或 Node.js 后端)解析 multipart 时,依赖字段名的命名约定(如 colours[0]、colours[1])来还原数组结构,而非依赖 [] 语法本身。
✅ 正确做法是显式展开数组为独立键值对:
$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+ 必须用 curl_file_create()
'colours[0]' => 'red',
'colours[1]' => 'yellow',
'colours[2]' => 'blue',
]);
// 可选:显式设置 User-Agent 避免部分服务端拦截
curl_setopt($ch, CURLOPT_USERAGENT, 'PHP-cURL');
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($httpCode === 200) {
echo "上传成功";
} else {
echo "请求失败,HTTP 状态码: {$httpCode}";
}
⚠️ 重要注意事项:
- curl_file_create() 是必需的:直接传入文件路径字符串(如 'file' => '@/path/to/file')在 PHP 5.6+ 已被弃用且可能失效;必须使用 CURLFile 对象(由 curl_file_create() 返回)。
- 索引必须连续且从 0 开始:服务端通常按 colours[0]、colours[1]… 顺序重建数组,跳号(如 [0]、[2])可能导致中间元素为空或解析异常。
- 避免 http_build_query():它生成 application/x-www-form-urlencoded 类型数据,而文件上传强制要求 multipart/form-data —— 混用会导致 415 Unsupported Media Type。
- 兼容性检查:若运行环境为 PHP
总结:PHP cURL 提交含文件与数组字段的表单,核心是将数组字段“扁平化”为带方括号索引的字符串键,配合 curl_file_create() 构建文件项,并确保整个 POSTFIELDS 为关联数组——cURL 会自动设置正确的 Content-Type 并完成 multipart 编码,无需手动构造边界或头信息。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











