如何通过PHP Curl向Spring Boot API传输多个文件?
PHP通过Curl向Spring Boot API上传多文件解决方案
问题核心
Spring Boot接口的@RequestPart("images") MultipartFile[]要求接收同一参数名images下的多个文件,而PHP常规的数组键名(如images[0])或直接传递数组的方式不符合Spring的参数解析规则,导致文件无法被识别。
正确实现代码
<?php // 1. 构造MyDataDto对应的JSON数据 $myData = [ "field1" => "示例值1", "field2" => "示例值2" ]; $jsonData = json_encode($myData); // 2. 准备多个待上传的文件(使用CURLFile对象,PHP 5.5+支持) $uploadFiles = [ new CURLFile('/绝对路径/图片1.jpg', 'image/jpeg', '自定义文件名1.jpg'), new CURLFile('/绝对路径/图片2.png', 'image/png', '自定义文件名2.png') ]; // 3. 构造POST请求字段:关键是将多个文件存入同一`images`键的数组 $postFields = [ // 用CURLStringFile指定data字段的Content-Type为JSON(PHP 7.4+支持) 'data' => new CURLStringFile($jsonData, 'application/json'), 'images' => $uploadFiles ]; // 4. 初始化并配置CURL $curlHandle = curl_init('http://你的Spring Boot接口地址'); curl_setopt($curlHandle, CURLOPT_POST, true); curl_setopt($curlHandle, CURLOPT_POSTFIELDS, $postFields); curl_setopt($curlHandle, CURLOPT_RETURNTRANSFER, true); // 若接口是HTTPS且需要跳过证书验证,可开启以下选项(生产环境不推荐) // curl_setopt($curlHandle, CURLOPT_SSL_VERIFYPEER, false); // 5. 执行请求并处理响应 $response = curl_exec($curlHandle); $httpStatus = curl_getinfo($curlHandle, CURLINFO_HTTP_CODE); curl_close($curlHandle); // 输出结果 echo "HTTP状态码: {$httpStatus}\n"; echo "接口响应: {$response}\n"; ?>
关键说明
参数格式匹配:
- 直接将多个
CURLFile对象存入images键的数组,PHP会自动编码为multipart/form-data格式,每个文件都使用images作为参数名,完全匹配Spring Boot的MultipartFile[]解析规则。 - 之前尝试的
images[0]格式会被Spring识别为独立参数(而非数组元素),因此无法被接收。
- 直接将多个
data字段处理:
- 由于Spring用
@RequestPart("data")接收DTO,必须指定该字段的Content-Type为application/json,PHP 7.4+可使用CURLStringFile实现;若使用更低版本PHP,需手动拼接多部分请求体或升级PHP版本。
- 由于Spring用
CURLFile的优势:
- 替代已废弃的
@前缀文件路径写法,避免安全风险,同时确保文件上传的兼容性。
- 替代已废弃的
内容的提问来源于stack exchange,提问作者odaa
相关产品推荐
相关产品推荐

