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

Laravel中使用Filament FileUpload读取上传JSON文件内容的问题

Laravel中使用Filament FileUpload读取上传JSON文件内容的问题

嘿,我来帮你搞定这个在Filament里读取上传JSON内容并预览的问题!

要实现上传后立刻展示JSON里的coordinates数据,你可以利用Filament的afterStateUpdated回调钩子,在用户上传文件后实时读取、解析内容,再把需要的数据展示在表单里。下面是修改后的完整代码示例,我会一步步给你解释:

Action::make('attachment')
    ->label('Attachment')
    ->form([
        // 限制仅允许上传JSON文件,避免无效文件
        FileUpload::make('attachment')
            ->acceptedFileTypes(['application/json'])
            ->afterStateUpdated(function (callable $set, $state) {
                if (!$state) {
                    $set('json_coordinates', '');
                    return;
                }

                try {
                    // 读取上传文件的真实内容
                    $fileContent = file_get_contents($state->getRealPath());
                    // 解析JSON为关联数组
                    $jsonData = json_decode($fileContent, true);

                    // 检查JSON解析是否成功
                    if (json_last_error() !== JSON_ERROR_NONE) {
                        throw new \Exception('JSON格式无效,请检查文件内容');
                    }

                    // 提取features里的coordinates数据
                    $coordinates = $jsonData['features'][0]['geometry']['coordinates'] ?? '未找到coordinates数据';
                    // 格式化JSON字符串,让预览更美观
                    $set('json_coordinates', json_encode($coordinates, JSON_PRETTY_PRINT));
                } catch (\Exception $e) {
                    // 捕获解析错误,给用户友好提示
                    $set('json_coordinates', '文件解析失败:' . $e->getMessage());
                }
            }),
        // 添加一个禁用的文本域,用来展示coordinates预览
        Textarea::make('json_coordinates')
            ->label('Coordinates预览')
            ->disabled()
            ->rows(10)
            ->columnSpanFull(),
    ])
    ->action(function (array $data) {
        // 这里处理最终的保存逻辑
        // 你可以再次读取文件内容,或者直接使用之前提取的数据
        $fileContent = file_get_contents($data['attachment']->getRealPath());
        $jsonData = json_decode($fileContent, true);
        
        // 比如提取coordinates并保存到数据库
        // $yourModel->coordinates = $jsonData['features'][0]['geometry']['coordinates'];
        // $yourModel->save();
    });

关键细节说明:

  • 限制文件类型:用acceptedFileTypes(['application/json'])确保用户只能上传JSON文件,减少后续解析错误的概率。
  • 实时解析回调:afterStateUpdated会在用户上传文件(或移除文件)时触发,在这里完成文件读取、JSON解析和数据提取。
  • 错误处理:加入try-catch和json_last_error检查,避免因无效JSON导致的报错,同时给用户清晰的提示。
  • 预览展示:用禁用的Textarea来展示格式化后的coordinates数据,用户可以直观看到内容,方便确认是否需要调整。

如果你的JSON里有多个features对象,你可以循环遍历$jsonData['features']来提取所有的coordinates,比如用Filament的Repeater组件来展示多条数据,不过这个场景下用文本域展示格式化后的JSON已经足够直观啦。

备注:内容来源于stack exchange,提问作者Bhazk

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.20 09:59:39