CKEdit5富文本编辑器简单图片上传&富文本转html

一个比较流行的富文本插件https://ckeditor.com/ckeditor-5/ 最近对比富文本组件的时候就顺便简单研究了下,它可以在线选择模块编译,只要不要选到付费的就可以免费使用,之前我下载的时候可以下载编译后的js及html 样例文件,现在好像只能按需生成Vanilla JS、React、Vue、Angular的项目安装运行源码(新版可以明显看到是否包含付费内容,有付费内容可以点左下角Back按钮返回重新筛选)

本文的内容是基于老版方式下载的代码进行改编的,本文介绍的CKEdit相关文件已上传git,地址见文末。

一、简单传图插件说明

测试时忘记当时具体选择的是哪些插件组件了,但是用的肯定有Simple Upload Adapter这个组件,免费版基本够用注意不要选到付费内容了,Simple Upload Adapter上传需要遵循CKEdit5本身约定的一些格式规范才能正常使用,主要是后端上传接口的返回json格式要严格按照官方的来(官方介绍 Simple upload adapter | CKEditor 5 Documentation)。下面是上传成功及失败的返回结果参考:

这个上传插件的相关配置可以在配置文件中加入,我这边是直接编辑的已经打包好的js文件,不是在vue这种项目源码引入里面进行的配置,我选择了看门狗功能可以在页面崩溃时恢复,在create时载入配置信息,下面是script.js中的实现片段(完整代码见文末)

var token = '456s456asd456sd45as6d4s';
watchdog
	
	.create( document.querySelector( '.editor' ), {
		// Editor configuration.

		simpleUpload: {           
            uploadUrl: 'http://xxxxxxx/upload.php',
            withCredentials: false,//跨域请求需要false
			headers: {
                'X9999-CSRF-TOKEN': 'CSRF-Token',
                Authorization: token
            },
        }
	} )
	.catch( handleSampleError );

上传后端upload.php是php写的一个简单的上传,源码如下可配合前端一起使用(处理了跨域问题):

<?php
// 处理 OPTIONS 请求
if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') {
    header("Access-Control-Allow-Origin: *");
    header("Access-Control-Allow-Methods: GET, POST, OPTIONS");
    header("Access-Control-Allow-Headers: *");//header("Access-Control-Allow-Headers: Content-Type");
    header("Access-Control-Allow-Credentials: false");
    header("Access-Control-Max-Age: 3600");
    exit;
}
//  这个是专门为CKedit5 简单上传制作的页面

header("Access-Control-Allow-Origin: *"); // 允许所有域访问,也可以指定特定域。
header("Access-Control-Allow-Methods: GET, POST, OPTIONS");
header("Access-Control-Allow-Headers: *");
// 允许上传的图片后缀
$allowedExts = array("gif", "jpeg", "jpg", "png");

//$_FILES["upload"]["name"]=$_FILES["upload"]["name"];
$temp = explode(".", $_FILES["upload"]["name"]);
//echo $_FILES["upload"]["size"];
$extension = end($temp);     // 获取文件后缀名
if ((($_FILES["upload"]["type"] == "image/gif")
|| ($_FILES["upload"]["type"] == "image/jpeg")
|| ($_FILES["upload"]["type"] == "image/jpg")
|| ($_FILES["upload"]["type"] == "image/pjpeg")
|| ($_FILES["upload"]["type"] == "image/x-png")
|| ($_FILES["upload"]["type"] == "image/png"))
&& ($_FILES["upload"]["size"] < 20480000)   // 小于 20000 kb
&& in_array($extension, $allowedExts))
{
	if ($_FILES["upload"]["error"] > 0)
	{
		echo "错误:: " . $_FILES["upload"]["error"] . "<br>";
	}
	else
	{
		//echo "上传文件名: " . $_FILES["upload"]["name"] . "<br>";
		//echo "文件类型: " . $_FILES["upload"]["type"] . "<br>";
		//echo "文件大小: " . ($_FILES["upload"]["size"] / 1024) . " kB<br>";
		//echo "文件临时存储的位置: " . $_FILES["upload"]["tmp_name"] . "<br>";
		
		// 判断当前目录下的 upload 目录是否存在该文件
		// 如果没有 upload 目录,你需要创建它,upload 目录权限为 777
		if (file_exists("upload/" . $_FILES["upload"]["name"]))
		{
			//echo $_FILES["upload"]["name"] . " 文件已经存在。 ";
		}
		else
		{
			// 如果 upload 目录不存在该文件则将文件上传到 upload 目录下
			$file_name= $_FILES["upload"]["name"].rand(1000,9999).".jpg";
			move_uploaded_file($_FILES["upload"]["tmp_name"], "upload/" . $file_name);
			//echo "文件存储在: " . "upload/" . $file_name;
			echo '{"url": "http://xxxxxxx/upload/'.$file_name.'"}';
			
		}
	}
}
else
{
	//echo "非法的文件格式";
	echo '{
    "error": {
        "message": "非法的文件格式"
    }
}
';

}
?>

二、富文本转html(注意要选择相关html特性支持组件)

CKEdit5生成的富文本,要制作成html需要引入content-styles.css这个官方的样式文件并将富文本内容包含在一个ck-content样式中。(html支持组件参考 General HTML Support | CKEditor 5 Documentation

关于content-styles.csscss样式的介绍及实现参考官方文档 Content styles | Legacy CKEditor 5 documentation 下面是简单的一个自定义的html生成案例:

<meta name="viewport" content="width=device-width,initial-scale=1.0,maximum-scale=1.0,minimum-scale=1.0,user-scalable=no">
<title>页面标题</title>
<link rel="stylesheet" href="./content-styles.css" type="text/css">
<style>
 * { touch-action:none;touch-action: pan-y; } 
</style>
<div class=".ck-content ck-content">


=========这里可以是富文本的html标签代码



</div>
<script>

window.οnlοad=function(){
document.body.addEventListener('touchmove', function (e) {
  e.preventDefault(); //阻止默认的处理方式(阻止下拉滑动的效果)
}, {passive: false}); //passive 参数不能省略,用来兼容ios和android


document.addEventListener('gesturestart', function (event) {
    event.preventDefault()
});

}
</script>

三、简单实现CKEdit5富文本内容的获取与更新

在创建的时候赋值

var myEditor;
…………
watchdog.setCreator( ( element, config ) => {
	
	return CKSource.Editor
		.create( element, config )
		.then( editor => {
			
			 myEditor = editor;
			 		
			return editor;
		} );
} );
…………

获取&更新富文本函数

function getvalue(){
	
	var s = myEditor.getData();
	console.log(s);
}

function setvalue(){

myEditor.setData("<p>内容</p>");

}

附上本文测试代码下载地址:

https://github.com/joolan/Small-examples/tree/main/CKedit%20simple%20upload

基于互联网精神,在注明出处的前提下本站文章可自由转载!

本文链接:https://ranjuan.cn/ckedit5-upload-pic-and-create-html/

赞赏

微信赞赏支付宝赞赏

发表评论