Laravel富文本编辑器集成文件浏览与上传功能【前端】

阿雪同学_4911

阿雪同学_4911

2026-08-07

774人浏览

原创

必须集成unisharp/laravel-filemanager(lfm)打通前后端文件管理链路,安装后发布配置与静态资源,确保public/vendor/laravel-filemanager/js/lfm.js存在;再分别为ckeditor5、tinymce、summernote配置lfm弹窗回调以支持图片插入与上传。

laravel富文本编辑器集成文件浏览与上传功能【前端】

要在Laravel项目中让富文本编辑器支持点击插入图片、拖拽上传文件、浏览服务器已有资源,必须打通前端编辑器与后端文件管理系统的通信链路,不能只靠前端JS硬编码路径或本地模拟。

选择兼容的文件管理器并引入前端资源

UniSharp/laravel-filemanager(LFM)是当前 Laravel 生态中最成熟、文档最全、与主流编辑器深度适配的文件管理方案。它提供统一的 /laravel-filemanager 端点,所有前端调用都走这个接口,无需为每个编辑器重复开发上传逻辑。

执行 composer require unisharp/laravel-filemanager 安装后,运行 php artisan vendor:publish --tag=lfm_config 生成配置文件,再执行 php artisan vendor:publish --tag=lfm_public 发布前端静态资源到 public/vendor/laravel-filemanager 目录。

确保 public/vendor/laravel-filemanager/js/lfm.js 已成功生成——【缺少这个文件会导致所有前端调用直接 404】。

为 CKEditor5 配置文件浏览按钮

CKEditor5 默认不带文件浏览功能,需手动注入 LFM 的弹窗桥接逻辑。

在初始化编辑器的 JS 中,添加 customUploadAdapter 和 toolbar 配置:

第一步:定义 LFM 弹窗打开函数

function openKCFinder() { window.kcf = window.open('/laravel-filemanager?callback=selectFile', 'kcfinder_textbox', 'status=0, toolbar=0, width=800, height=500, resizable=1, menubar=0, location=0'); }

第二步:在 CKEditor5 配置中启用 imageUpload 插件,并绑定回调

ClassicEditor.create(document.querySelector('#editor'), { toolbar: ['heading', '|', 'bold', 'italic', 'link', 'imageUpload', 'blockQuote', 'undo', 'redo'], image: { upload: { types: ['jpeg', 'png', 'gif', 'webp'] }, } }).then(editor => { const imgButton = editor.ui.componentFactory.create('imageUpload'); editor.ui.view.toolbar.items.add(imgButton); editor.plugins.get('ImageUploadEditing').on('fileUploadRequest', (evt, data) => { const xhr = data.xhr; xhr.upload.addEventListener('progress', evt => { editor.editing.view.notifyDirty(); }); }); }).catch(error => console.error(error));

第三步:在页面底部添加回调函数,接收 LFM 返回的文件路径

window.selectFile = function(url, file) { const editor = ClassicEditor.instances[0]; editor.model.change(writer => { const imageElement = editor.model.schema.createElement('imageBlock'); imageElement.setAttribute('src', url); editor.model.insertContent(imageElement); }); };

Laravel Creem Agent
Laravel Creem Agent

Creem 支付商店助理 — 查询订阅、客户、交易、产品,执行心跳检查,管理本地 Laravel支付商店。

下载

TinyMCE 集成 LFM 的两种方式

方法一:使用官方推荐的 file_picker_callback(推荐用于新版 TinyMCE 6+)

在 TinyMCE 初始化配置中加入:

tinymce.init({ selector: '#mytextarea', plugins: 'image link', toolbar: 'image', file_picker_callback: function(callback, value, meta) { let x = window.innerWidth || document.documentElement.clientWidth || document.getElementsByTagName('body')[0].clientWidth; let y = window.innerHeight || document.documentElement.clientHeight || document.getElementsByTagName('body')[0].clientHeight; let cmsURL = '/laravel-filemanager?lang=' + tinymce.settings.language + '&callback=customSelectFile'; tinyMCE.activeEditor.windowManager.openUrl({ url: cmsURL, title: 'File Manager', width: x * 0.8, height: y * 0.8, resizable: 'yes' }); }, });

方法二:手动绑定按钮触发(兼容老版本或需要自定义 UI 时)

在页面中添加一个隐藏的 input[type="file"] 和一个 visible button,点击 button 后执行 document.getElementById('lfm').click(),再监听 change 事件读取选中文件并插入编辑器。这种方式需自行处理跨域、CSRF token、图片预览等细节,【不推荐新手采用】。

Summernote 嵌入式弹窗集成

Summernote 本身不支持外部文件管理器,但可通过自定义按钮扩展实现。

先注册插件:

$.summernote.plugins['lfm'] = function(context) { const self = this; const ui = $.summernote.ui; const button = ui.button({ contents: '<i class="fa fa-picture-o"></i> 图片库', tooltip: '从服务器选择图片', click: function() { const lfm = window.open('/laravel-filemanager?&callback=lfmCallback', 'lfm', 'width=800,height=500'); window.lfmCallback = function(url, path) { context.invoke('editor.insertImage', url); }; } }); context.memo('button.lfm', function() { return button.render(); }); };

再在 Summernote 初始化时启用:

$('#summernote').summernote({ height: 300, toolbar: [ ['insert', ['lfm', 'picture', 'link']] ], });

这一步必须保证 window.lfmCallback 是全局可写函数,否则回调无法触发插入动作。

前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!

相关专题

更多
python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2343

5

前端如何实现即时通讯
前端如何实现即时通讯

实现即时通讯的方法有WebSocket、Long Polling、Server-Sent Events、WebRTC等等。详细介绍:1、WebSocket,它可以在客户端和服务器之间建立持久连接,实现实时的双向通信,前端可以使用 WebSocket API来创建WebSocket连接,并通过发送和接收消息来实现即时通讯;2、Long Polling,是一种模拟实时通信的技术等等。

2023.10.09

5063

6

前端和后端的区别
前端和后端的区别

前端关注的是用户界面的设计和交互,而后端则注重数据处理和逻辑控制。想了解更多前端后端的相关内容,可以阅读本专题下面的文章。

2024.03.19

6150

13

php和前端的关联介绍
php和前端的关联介绍

php既可以作为前端语言,也可以作为后端语言。想了解更多php和前端的相关内容,可以阅读本专题下面的文章。

2024.03.22

5678

10

前端外包工作内容有哪些
前端外包工作内容有哪些

前端外包工作内容包括:1. 网站和应用程序开发;2. 用户界面和交互设计;3. 用户体验优化;4. 设计和视觉开发;5. 跨浏览器兼容性;6. 性能优化;7. 维护和更新;8. 项目管理和沟通。想了解更多前端的相关内容,可以阅读本专题下面的文章。

2024.05.22

803

5

php文件怎么打开
php文件怎么打开

打开php文件步骤:1、选择文本编辑器;2、在选择的文本编辑器中,创建一个新的文件,并将其保存为.php文件;3、在创建的PHP文件中,编写PHP代码;4、要在本地计算机上运行PHP文件,需要设置一个服务器环境;5、安装服务器环境后,需要将PHP文件放入服务器目录中;6、一旦将PHP文件放入服务器目录中,就可以通过浏览器来运行它。

2023.09.01

10264

6

php怎么取出数组的前几个元素
php怎么取出数组的前几个元素

取出php数组的前几个元素的方法有使用array_slice()函数、使用array_splice()函数、使用循环遍历、使用array_slice()函数和array_values()函数等。本专题为大家提供php数组相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.11

6061

5

php反序列化失败怎么办
php反序列化失败怎么办

php反序列化失败的解决办法检查序列化数据。检查类定义、检查错误日志、更新PHP版本和应用安全措施等。本专题为大家提供php反序列化相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.11

2095

5

php怎么连接mssql数据库
php怎么连接mssql数据库

连接方法:1、通过mssql_系列函数;2、通过sqlsrv_系列函数;3、通过odbc方式连接;4、通过PDO方式;5、通过COM方式连接。想了解php怎么连接mssql数据库的详细内容,可以访问下面的文章。

2023.10.23

3808

4

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
如何安装 Composer
如何安装 Composer

共1课时 | 201人学习

Composer手册
Composer手册

共0课时 | 0人学习