首页 > 建站教程 > PHP教程 >  ThinkPHP+WangEditor实现富文本+上传图片+上传视频功能正文

ThinkPHP+WangEditor实现富文本+上传图片+上传视频功能

本文基于ThinkPHP+WangEditor实现了富文本+上传图片+上传视频,前端框架采用的是layuimini-2,步骤非常详细,当然也非常简单,例如没有处理上传失败具体情况的返回等。文末提供了WangEditor的压缩包,下面是最终实现效果


大图缩略图.png


下面是具体步骤:

1、编辑器的html:

<div class="layui-form-item">
        <label class="layui-form-label">新闻内容</label>
        <div class="layui-input-block" style="border: 1px solid #ccc;">
            <div id="editor-toolbar" style="border-bottom: 1px solid #ccc;"></div>
            <div id="editor-text-area" style="height: 500px"></div>
        </div>
    </div>


2、引入编辑器(引入layui等框架在这里不写了)

<link href="/static/admin/wangeditor/style.css" rel="stylesheet">
<script src="/static/admin/wangeditor/index.js"></script>


3、js初始化配置WangEditor,并回显后端读取的富文本内容

const E = window.wangEditor
/*编辑器配置,开始*/
// 切换语言
window.editor = E.createEditor({
    selector: '#editor-text-area',
    // 回显数据库查询到的富文本,这里要转换下,否则会把标签也显示到编辑器中,如果是新增,这里留空
    html: `{$data.content|html_entity_decode|raw}`,
    mode: 'simple',
    config: {
        placeholder: '请输入新闻内容',
        MENU_CONF: {
            // 上传图片配置,这里的server为后端上传地址,fieldName为后端接收的文件参数
            uploadImage: {
                server: '/admin/news/uploadImg',
                fieldName: 'file',
                // 选择文件时的类型限制,默认为 ['image/*'] 。如不想限制,则设置为 []
                allowedFileTypes: ['image/*'],
                maxFileSize: 10 * 1024 * 1024, // 单个文件的最大体积限制,默认为 2M
                base64LimitSize: 1 * 1024 * 1024 // 1M 以下插入 base64
            },
            // 上传视频配置,这里的server为后端上传地址,fieldName为后端接收的文件参数
            uploadVideo: {
                server: '/admin/news/uploadVideo',
                fieldName: 'file',
                // 选择文件时的类型限制,默认为 ['video/*'] 。如不想限制,则设置为 []
                allowedFileTypes: ['video/*'],
                maxFileSize: 100 * 1024 * 1024 // 单个文件的最大体积限制,默认为 2M
            },
        }
    }
})
E.createToolbar({
    editor,
    selector: '#editor-toolbar',
    config: {
        excludeKeys: ["codeBlock"]
    }
})
/*编辑器配置,结束*/


4、在保存时,利用editor.getHtml()获取编辑器的内容

layui.use(['form'], function () {
    var form = layui.form,
        layer = layui.layer,
        $ = layui.$;
    //监听提交
    form.on('submit(saveBtn)', function (data) {
        // 保存时,获取编辑器填写的内容
        data.field.content = editor.getHtml()
        $.ajax({
            type: 'PUT',
            url: '/admin/news/'+{$news.id},
            data:data.field,
            success:(res) => {
                var indexWindow = window.top.document.querySelector('[src="admin/news"]')
                indexWindow.setAttribute('src','admin/news');
                // 关闭当前窗口
                var iframeIndex = parent.layer.getFrameIndex(window.name);
                parent.layer.close(iframeIndex);
            }
        })
        return false;
    });
});


5、php代码,注意上传后返回的数据格式必须按照下面的来,否则WangEditor无法解析结果,就无法将图片、视频插入到编辑器内

public function uploadImg(Request $request)
{
    // file('file') 为富文本的文件对应的字段名
    $file = $request -> file('file');
    $path = \think\facade\Filesystem::putFile('news', $file, 'md5');
    $path = str_replace('\\','/',$path);
    if($path) {
        return json(['errno' => 0, 'data' => ['url' => '/storage/'.$path, 'alt' => '茉酸奶', 'href' => '/storage/'.$path,]]);
    } else {
        return json(['errno' => 1, 'message' => '上传失败!']);
    }
}
public function uploadVideo(Request $request)
{
    // file('file') 为富文本的文件对应的字段名
    $file = $request -> file('file');
    $path = \think\facade\Filesystem::putFile('news', $file, 'md5');
    $path = str_replace('\\','/',$path);
    if($path) {
          // poster为视频封面图,这里就不写了,可以前端实现也可以php实现
            return json(['errno' => 0, 'data' => ['url' => '/storage/'.$path, 'poster' => '',]]);
      } else {
            return json(['errno' => 1, 'message' => '上传失败!']);
      }
}

最后,附上WangEditor下载地址:https://pan.baidu.com/s/1bvVAJ3V_QFDc0w3V1BbDKQ 提取码: r8p3