在 Laravel 6 中通过 cURL 上传文件必须使用 CURLFile 类封装文件路径构造 multipart/form-data 请求,禁用 JSON 或字符串传参;需确保 cURL 扩展启用、file_uploads=On,并在 HTTPS 开发环境临时禁用 SSL 验证。

在 Laravel 6 中通过 cURL 上传文件,核心是正确构造 multipart/form-data 请求,并让服务端能识别为合法的文件上传。不能用普通 JSON 或表单字符串(如 -d),必须使用 CURLFile 类封装文件路径。
确保 PHP cURL 和文件上传支持已启用
检查 phpinfo() 中:
– cURL 扩展是否加载(function_exists('curl_init') 返回 true)
– file_uploads = On 且 upload_max_filesize 足够大
– 若上传到 HTTPS 接口,本地开发需临时禁用 SSL 验证(仅限开发环境)
使用 CURLFile 构造文件参数
Laravel 6 基于 PHP 7.2+,支持 CURLFile。直接传路径会失败,必须实例化:
- 获取上传的文件对象:
$file = $request->file('avatar'); - 验证有效性:
if ($file && $file->isValid()) { ... } - 获取真实路径:
$realPath = $file->getRealPath(); - 创建 CURLFile 实例:
$cfile = new \CURLFile($realPath, $file->getMimeType(), $file->getClientOriginalName()); - 将它放入 POST 参数:
$params['avatar'] = $cfile;
发起 cURL 请求并设置关键选项
手动初始化 cURL 句柄时,注意以下必设项:
Laravel Cloud(cloud.laravel.com)。此技能用于处理所有 Laravel Cloud 请求,包括搜索和读取数据。只要任务涉及 Laravel Cloud,即使用此技能。
-
CURLOPT_URL:目标接口完整 URL(含协议和路径) -
CURLOPT_POST => true:明确声明为 POST -
CURLOPT_POSTFIELDS => $params:传入含CURLFile的数组(不要 JSON 编码) -
CURLOPT_RETURNTRANSFER => true:确保返回响应内容而非直接输出 - HTTPS 场景下,开发可加:
CURLOPT_SSL_VERIFYPEER => false和CURLOPT_SSL_VERIFYHOST => false
服务端接收方必须注明格式要求
被调用的 API 文档或控制器应明确说明:
- “本接口仅接受
multipart/form-data类型请求” - “客户端不可手动设置
Content-Type头,由 cURL 自动填充边界(boundary)” - 推荐测试命令:
curl -F "avatar=@/path/to/photo.jpg" https://api.example.com/upload
不复杂但容易忽略。关键就是不用 -d、不用 json_encode、不手写 Content-Type,老老实实走 CURLFile + 数组传参这条路。










