Laravel如何接收Angular以JSON格式传输的文件并实现FTP上传
解决方案
问题根因
$request->file() 仅支持解析 multipart/form-data 类型请求中的文件资源,你通过JSON格式传输的文件实际是Base64编码的字符串,不属于标准上传文件流范畴,因此调用该方法会返回null。
实现步骤
1. 读取并解码Base64文件内容
直接从请求参数中获取对应字段的Base64字符串,拆分解码为二进制文件内容:
// 获取JSON中的Base64文件内容 $base64Raw = $request->input('Fichier1'); // 处理带格式前缀(如 data:image/jpeg;base64, 这类前缀 if (str_contains($base64Raw, ';base64,')) { list($typeInfo, $base64Content) = explode(';base64,', $base64Raw); $fileContent = base64_decode($base64Content); // 提取文件扩展名 $extension = explode('/', $typeInfo)[1] ?? 'bin'; } else { // 无前缀时直接解码 $fileContent = base64_decode($base64Raw); $extension = 'bin'; }
2. 配置FTP磁盘
先在项目配置文件 config/filesystems.php 中添加FTP存储配置:
'disks' => [ // 其他磁盘配置... 'ftp' => [ 'driver' => 'ftp', 'host' => env('FTP_HOST'), 'username' => env('FTP_USERNAME'), 'password' => env('FTP_PASSWORD'), 'root' => env('FTP_ROOT'), // FTP服务器上的存储根路径 'port' => env('FTP_PORT', 21), 'passive' => true, 'ssl' => false, ], ]
对应在 .env 文件中添加对应的FTP配置项:
FTP_HOST=你的FTP服务器地址 FTP_USERNAME=FTP账号 FTP_PASSWORD=FTP密码 FTP_ROOT=存储根路径 FTP_PORT=21
3. 上传文件到FTP
使用Laravel自带的Storage门面完成上传:
use Illuminate\Support\Facades\Storage; // 生成唯一文件名避免重名 $fileName = uniqid('file_', true) . '.' . $extension; // 上传到FTP $uploadRes = Storage::disk('ftp')->put($fileName, $fileContent); if ($uploadRes) { return response()->json([ 'code' => 200, 'msg' => '上传成功', 'file_path' => $fileName ]); } return response()->json([ 'code' => 500, 'msg' => '上传失败' ], 500);
优化建议
- 传输大文件时不推荐用Base64格式传输,会增加30%左右的数据体积,建议改用
multipart/form-data格式上传可直接使用$request->file()读取文件,性能更好。 - 记得校验Base64内容合法性,避免解码失败导致上传异常。
内容的提问来源于stack exchange,提问作者andres castellanos
相关产品推荐
相关产品推荐

