You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 07:39:02