使任何富文本编辑器可粘贴图片,js监听鼠标粘贴事件,亲测summernote编辑器

之我有一篇文章写到了,怎么处理富文本上传图片后单用户删除了,造成服务器大量垃圾图片的问题,解决方案请戳链接

怎么保证用富文本编辑器不让服务器产生垃圾图片,神器redis的发布订阅

做富文本编辑器发布文章的时候,有这样一个需求,就是直接使用qq的快捷键截图,然后直接在富文本编辑器把图片粘贴了,然后图片就可以自动上传到服务器,我测试了一些富文本有的是可以实现了的,但summernote就没有实现,但我想用这个怎么办,于是就搜索整合出了解决方案。

实现原理就是,js直接监听鼠标的粘贴事件,如果粘贴的内容含有图片,就直接上传到服务器,并将图片显示在页面上!

下面是关键代码:

 获取编辑框,添加监听粘贴事件:

//summernote
//监听粘贴图片
document.getElementsByClassName('note-editable')[0].addEventListener('paste',function(e){
    if ( !(e.clipboardData && e.clipboardData.items) ) {
        return;
    }
    for (var i = 0, len = e.clipboardData.items.length; i < len; i++) {
        var item = e.clipboardData.items[i];

        if (item.kind === "string") {
            item.getAsString(function (str) {
                console.log(str);
            })
        } else if (item.kind === "file") {
            var f= item.getAsFile();
			parseFile(f, 800,function(base64){
				$.post("/manager/uploadImg",{"imgStr":base64},function(data){
					$('#summernote').summernote('editor.insertImage', data.msg);
	         	});
			})
            console.log(f);
        }
    }
});

 这里说明一下这个parseFile方法,就是将图片转化为base64编码,并压缩base64编码,然后上传到服务器。

代码我也贴出来吧:

//压缩方法
function parseFile(file, w,callBack) {
	var reader = new FileReader();
	reader.readAsDataURL(file);
	reader.onload = function(e){
		var newImage = new Image();
		var quality = 0.7;    //压缩系数0-1之间
		newImage.src = reader.result;
		console.log("原来长度",reader.result.length)
		newImage.setAttribute("crossOrigin", 'Anonymous');	//url为外域时需要
		var imgWidth, imgHeight;
		newImage.onload = function () {
			imgWidth = this.width;
			imgHeight = this.height;
			var canvas = document.createElement("canvas");
			var ctx = canvas.getContext("2d");
			if (Math.max(imgWidth, imgHeight) > w) {
				if (imgWidth > imgHeight) {
					canvas.width = w;
					canvas.height = w * imgHeight / imgWidth;
				} else {
					canvas.height = w;
					canvas.width = w * imgWidth / imgHeight;
				}
			} else {
				canvas.width = imgWidth;
				canvas.height = imgHeight;
				quality = 0.7;
			}
			ctx.clearRect(0, 0, canvas.width, canvas.height);
			ctx.drawImage(this, 0, 0, canvas.width, canvas.height);
			var base64 = canvas.toDataURL("image/jpeg", quality); //压缩语句
			// 如想确保图片压缩到自己想要的尺寸,如要求在50-150kb之间,请加以下语句,quality初始值根据情况自定
			while (base64.length / 1024 > 100) { 
			 	quality -= 0.01;
			 	base64 = canvas.toDataURL("image/jpeg", quality);
			}
			// 防止最后一次压缩低于最低尺寸,只要quality递减合理,无需考虑
			// while (base64.length / 1024 < 50) {
			// 	quality += 0.001;
			// 	base64 = canvas.toDataURL("image/jpeg", quality);
			// }
			console.log("压缩后长度",base64.length)
			callBack(base64)
		}
	}
}

利用这个思路,基本上可以应对任何的富文本了吧,只要支持上传方法重写就可以!

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Tinymce提供了一些配置选项,可以实现从Word中复制粘贴内容并保留格式和图片的功能。具体实现步骤如下: 1. 加载tinymce的源文件和plugins目录下的插件文件。例如: ```html <script src="/path/to/tinymce.min.js"></script> <script src="/path/to/plugins/paste/plugin.min.js"></script> <script src="/path/to/plugins/paste/plugin.min.js"></script> ``` 2. 设置tinymce的选项,包括使用的主题、插件和工具栏等。例如: ```javascript tinymce.init({ selector: 'textarea', plugins: 'paste image', toolbar: 'undo redo | bold italic | image', paste_data_images: true, images_upload_url: '/path/to/upload', images_upload_handler: function (blobInfo, success, failure) { // 处理图片上传 } }); ``` 其中,paste_data_images选项用于启用从Word中粘贴图片的功能,images_upload_url和images_upload_handler用于处理上传的图片。 3. 在服务器端处理上传的图片,并返回图片的URL地址。例如,使用PHP实现图片上传功能: ```php <?php if ($_FILES['file']['error'] === UPLOAD_ERR_OK) { $file_tmp = $_FILES['file']['tmp_name']; $file_name = $_FILES['file']['name']; $file_ext = pathinfo($file_name, PATHINFO_EXTENSION); $file_path = '/path/to/images/' . uniqid() . '.' . $file_ext; move_uploaded_file($file_tmp, $file_path); echo json_encode(['location' => $file_path]); } else { echo json_encode(['error' => '上传失败']); } ``` 以上就是使用Tinymce实现从Word中复制粘贴内容并保留格式和图片的方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值