tinymce 实现 粘贴图片自动上传

tinymce 中文文档:上传图片和文件

关于图片上传的踩坑记录,基本就是如下几个

文章目录

  • tinymce 实现 粘贴图片自动上传
    • 不能复制本地图片然后粘贴
    • 粘贴进来的图片上传问题
      • 上传图片后回显
    • 图片点开大图后复制进来 2 张的问题

不能复制本地图片然后粘贴

图片的复制粘贴,依赖于 paste 插件 文档:插件 \ paste 粘贴插件

简单的配置如下:

tinymce.init({selector: '#tinydemo',plugins: 'paste',toolbar: 'paste',paste_data_images: true // 默认是false的,记得要改为true才能粘贴
})

粘贴后的图片在显示上是这样的:

是一个二进制流链接的文件,这种保存到到后端在回显也显示不了了,所以要配置上传。还是看官方文档 上传图片和文件 | TinyMCE 中文文档中文手册 (ax-z.cn) 由于我都是用的自己的上传,这一块就没去深究


粘贴进来的图片上传问题

如何获取粘贴的图片内容: 上传图片和文件 | TinyMCE 中文文档中文手册 (ax-z.cn)

找到 images_upload_handler 函数一栏,在 init 方法中使用这个函数

tinymce.init({images_upload_handler: function(blobInfo, success, failure, progress) {}
})

blodInfo 对象包含了几个方法:

方法名 执行后返回值
base64 图片对应的 base64 编码
blob 二进制流 File 对象
blobUri 二进制流的显示 URL(临时 URL,页面关闭后就消失了)
filename 文件名称(这里是被转换过的文件名称,并非原名)如: “mceclip0.jpg”
id 文件 ID 如: “mceclip0”
name 文件名称,不带后缀的 如:“mceclip0”
uri 最后一个我也不知道是啥

如果要获取文件原名,要在 blod 对象中拿

上传图片,自然是拿 blod 对象,然后结合自己的业务逻辑去上传给后端就行

上传图片后回显

success, failure, progress 几个回调的作用

名称 作用
success success('http://www.xxxx.com/xxx.png') 要插入的图片
failure failure() 印象中这个方法也很鸡肋,甚至最后我都用 success 了
progress progress(50) 显示图片上传的进度(全局显示,没啥作用)

图片点开大图后复制进来 2 张的问题

你以为坑到这里就结束了吗?no no no,这是各大平台都会出现的问题。

问题是这样的:window 平台下,图片在缩略图/没点开大图的时候,复制粘贴,没问题。
如果双击,打开了图片的大图在进行复制,粘贴到编辑器后,会显示 2 张一样的图片。包括微信点开大图,等等都会

我粘贴进去的图片名称是 :img.jpg。很明显在打印信息的 blodInfo.blod().name 中,多了一张 image.png 的图片。所以这并不属于编辑器的 bug,而是 window 平台下的机制

无论粘贴什么图片,只要点开大图都会多一张叫 image.png 的图片。可是不排除用户的确会上传 image.png 的图片,所以不能简单粗暴的过滤 image.png 的图片。

利用防抖函数的思想,过滤掉多余的 image.png

由于 bug 修复的比较紧急,代码并没有做过多的优化/封装成方法,稍微的看看逻辑就好

通常来说,image.png 都会比原图要先复制进来

  1. 遇到名为 image.png 的图片,延迟 30 毫秒在上传(这里用到了定时器 setTimeout)
  2. 如果是触发了上面说的 bug,30 毫秒内原图应该就会被复制进来了,那就是说如果第二次触发 images_upload_handler 函数时,
    2.1. 如果还有定时器在等待,那就说明定时器里面的图是多余的
    2.2. 如果超过 30 毫秒后还没有另外的图片触发images_upload_handler 函数,说明用户上传的就是叫 image.png 的图片,让定时器执行上传完成即可。
  3. 30 毫秒内触发了删除,定时器肯定要清除,可是图片还在编辑器内没删除,这时候就要执行 removeFn。在下面备注也有写了,记得要用闭包,把image.png图片对应的success函数存起来。因为如果图片上传成功了,还得靠这个函数设置成对应的图片
// 定义2个全局变量
let uploadTimeOut = null
let removeFn = nulltinymce.init({// 上传函数images_upload_handler: (blobInfo, success, failure, progress) => {if (uploadTimeOut) {removeFn && removeFn()clearTimeout(uploadTimeOut)}let fileInfo = blobInfo.blob()// 定义一个上传方法var upload = () => {// this.myUpload 是 上传文件的逻辑了,用promise包了一下this.myUpload(fileInfo).then(res => {// 上传成功后success(res.data.url)}).catch(res => {// 上传失败后,把src标记为 uploadFail ,然后在删除// failure 函数有什么坑了,所以不想用它了success('uploadFail')// setTimeOut 是为了然success函数执行到位后在删除,否则可能查不到对应的图片setTimeout(() => {let errorImg = document.querySelectorAll('img[src="uploadFail"]')errorImg.forEach(item => {item.parentNode.removeChild(item)})}, 100)})}if (fileInfo.name == 'image.png') {uploadTimeOut = setTimeout(() => upload(), 30)// 这里要用一下闭包把当前的success函数保存起来,具体为啥一下子说不清,存起来就是了// 图片复制进来后唯一的标识就是 blobUri 了,到时候删除还得靠他// removeFn 与第9行代码呼应removeFn = (function(url, cb) {return function() {cb && cb(url)let imgNode = document.querySelector('img[src="' + url + '"]')imgNode && imgNode.parentNode && imgNode.parentNode.removeChild(imgNode)removeFn = null}})(blobInfo.blobUri(), success)} else {upload()}}
})

大功告成~

tinymce 实现 粘贴图片自动上传相关推荐

  1. ckeditor java 上传_CKEditor粘贴图片自动上传到服务器(Java版)

    环境:java,springmvc,ckeditor,tomcat,maven 情况:在做项目的时候发现本地图片粘贴到ckeditor中,img标签的src中的值是"data:image/p ...

  2. KindEditor实现WORD粘贴图片自动上传

    1.4.2之后官方并没有做功能的改动,1.4.2在word复制这块没有bug,其他版本会出现手动无法转存的情况 本文使用的后台是Java.前端为Jsp(前端都一样,后台如果语言不通得自己做 Base6 ...

  3. java xheditor 上传图片_xhEditor粘贴图片自动上传到服务器(Java版)

    由于工作需要必须将word文档内容粘贴到编辑器中使用 但发现word中的图片粘贴后变成了file:///xxxx.jpg这种内容,如果上传到服务器后其他人也访问不了,网上找了很多编辑器发现没有一个能直 ...

  4. 百度编辑器图片上传 java_百度编辑器粘贴图片自动上传到服务器(Java版)

    Chrome+IE默认支持粘贴剪切板中的图片,但是我要发布的文章存在word里面,图片多达数十张,我总不能一张一张复制吧? Chrome高版本提供了可以将单张图片转换在BASE64字符串的功能.但是无 ...

  5. 关于umeditor粘贴图片自动上传

    由于工作需要必须将word文档内容粘贴到编辑器中使用 但发现word中的图片粘贴后变成了file:///xxxx.jpg这种内容,如果上传到服务器后其他人也访问不了,网上找了很多编辑器发现没有一个能直 ...

  6. tinymce直接粘贴图片实现

    tinymce是很优秀的一款富文本编辑器,可以去官网下载.https://www.tiny.cloud 这里分享的是它官网的一个收费插件powerpaste的旧版本源码,但也不影响功能使用. umed ...

  7. 织梦CMS粘贴图片自动上传到服务器(Java版)

    如何做到 ueditor批量上传word图片? 1.前端引用代码 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional// ...

  8. umeditor粘贴图片自动上传到服务器(Java版)

    当前功能基于PHP,其它语言流程大致相同 1.新增上传word json配置 在ueditor\php\config.json中新增如下配置: /* 上传word配置 */ "wordAct ...

  9. element upload组件,ctrl v粘贴图片自动上传

    产品提了一个需求,需要用户可以在微信或者qq截屏之后,ctrl v直接上传图片,网上查了几篇文章参考了其中一篇实现了 参考文章:https://blog.csdn.net/rencaishigepi/ ...

  10. wordpress插件Imagepaste的命名规则修改(一款 直接复制粘贴图片自动上传的编辑器增强插件)

    这款组件还是不错的,就是命名规则为把原文件名进行MD5编码,这样,如果原文件名出现一样的情况就发疯了. 所以,动手改写插件...... 找到插件的目录, 打开wp-content目录下plugins/ ...

最新文章

  1. 表上作业法matlab实现,高人帮忙改改,有关表上作业法的C++程序
  2. 苹果智能车芯片已基本就绪!最新造车进展曝光,股价一夜暴涨4000亿
  3. opencv中伪彩色applyColorMap函数(C++ / Python)
  4. java 集成grizzly_java – 在Grizzly上使用JaaS和Jersey
  5. Adobe Bridge 2021中文版
  6. 微软要打造通用Windows平台,但这将是一场苦战
  7. 选了combobox里的选项后没激发change事件_stata 事件分析法
  8. array用法 numpy_Numpy统计计算、数组比较,看这篇就够了
  9. 找工作经验之——准备工作
  10. Spring 传播方式
  11. [Python] numpy.ndenumerate() 获得一对数组坐标和值
  12. CDMA,GSM,WCDMA,TD-SCDMA,CDMA2000,3G的区别
  13. ERP项目实施方法论
  14. js打印线程id_泥瓦匠聊并发编程:线程与多线程必知必会(基础篇)
  15. Mybatis 核心知识点整理成图
  16. 如何 拆 贴片电容 而不是把焊盘给搞坏
  17. python-web开发[12]之css案例、bootstrap探索
  18. windows10出现扬声器小红叉问题的解决方法
  19. PhotoShopCS6从入门到精通--笔记
  20. C#操作Word模板文件 替换并重新生成

热门文章

  1. 【Unity3D日常开发】应粉丝邀约,写一篇单例模式在Unity的实际应用,记得一键三连哦
  2. mysql在线检测文件是否损坏,mysql数据文件损坏后的修复方法
  3. ​Copyright到底是什么意思?
  4. 农大计算机工程,肖德琴-华南农业大学计算机科学与工程系
  5. 霓虹灯的c语言编写程序,用C语言编写单片机流水灯程序
  6. 七脉轮位置_[转载]地球的七大脉轮位置
  7. Java理解mian方法
  8. chromecast 协议_如何更改您的Chromecast的设备名称
  9. excel怎么录入身份证号码快速方便?
  10. unity android ios9,Unity For Android iOS 的本地推送