java富文本框如何加复制粘贴,关于复制 word 图文到富文本中的问题

起因

事情的经过是这样的:👉我们有一个考试系统,里面有个录题的功能(就是在富文本中编辑),很多情况下,我们还会有一份现成的 word 文档(就是一些题目),这样一来我们就可以从 word 中复制题目到富文本中,题目就算录入完成了。但是问题来了,如果我是图文一起复制的(图文分开是可以的),图片是显示不出来的,就像下面这样子👇:73207e32beb19fe85d68eee9b360ccf3.png

e7077f744f95a50cb0407da0782f0182.png

c877def60b93e05c17fc67e8bcb142ff.png

所以,能不能让图片也显示出来呢?不知道,也搜不到,只能随便试试了。对了,文中的示例用的是 vue-quill-editor 富文本编辑器,不过其实这个问题到头来和 quill 本身没有什么关系😂。

陷入沉思

首先明确下问题的初衷:⭕就是让富文本能够显示从 word 复制过来的图文信息中的图片,该图片要么是前端转成 base64 格式,要么是传给后端返回一个 src 来展示,这里以 base64 举例。

想法一

最初的想法就是各种搜索罗🤔,然后就。。。未果而终。那。。。就只能自己动手丰衣足食了。

常规的第一个想法是看看编辑器本身有没有暴露什么接口,让你可以自己处理一下复制的内容,找了一下,是有的,心理窃喜😁,如下面几张图所示:ae5218f09357c2d4105ab33f327bcecc.png

a25b1fe404fd92104c1fe15a2e1dd4ce.png

923a7cdeaaad8d7a96b78ecfca1f0507.png

于是乎我们顺利成章的把 node 和 delta 的内容打印出来,如下图所示👇:2a98cf1064cfc978484e9bc9c2ddacf2.png

如果你不了解 delta 也没关系(可以描述富文本的一种数据格式),你只要知道里面有个 image 字段,到时输出到富文本大概会长这个样子:insert%20%E9%87%8C%E9%9D%A2%E7%9A%84%20image。但很遗憾的是这个 image 字段派不上用场,因为浏览器出于安全原因考虑😒,我们仅仅根据 file://xxx 这个路径是访问不到本地资源的,所以我们是读不到该图片的,也就是我们最开始控制台报错的样子:

667d59739a9078eb56a3f182d3e6d8d9.png

不过这里我还是先随便复制了一个 base64 格式的图片替换这个 image 字段,图片是能正常显示的。那么接下来我们的目的就是想办法读取到图文中的图片。

想法二

于是乎,我又去 quill 找了找,看看有没有更早的暴露一些接口,能够让我们更早的处理复制的内容,因为上面那个接口显然已经是处理过后的内容,我们需要再快一步🚀。找啊找,找啊找,找到一个好朋友。又很遗憾啊,我并没有找到,脑子逐渐空白😯。。。

闭目养神了一会之后,实在是不知道咋下手,然后就去稍微瞟了瞟 quill 源码,看看里面做了啥子👀:1881614009256ff805d17c3233782ec2.png

8ca9365968c5665672537fd1286c0c7c.png

通过上面两个图我们可以明显的看到,我们要找的图片文件应该就在 e.clipboardData.files 里面,但是我们命🀄的逻辑应该是这个 this.onPaste(range, { html, text }),显然这个方法并没有传入 files,应该也就没有对其做相应的处理。看起来我们似乎还要改改别人的代码才行,不过改别人的代码还是有门槛的,而且久了不好维护,所以我们先从小的着手,自己先添加个 paste 事件,看下原始的 paste 事件是否能够获取到图片文件并转成 base64,如果可以的话再继续深入😎。

想法三

于是乎,我们在富文本中添加了自己的 paste 事件,并将结果打印出来,如下图所示:162d79dc7bff371707756ffbcd6b1cc2.png

baf1d9b3821b6ee37f4c824db8b6decb.png

我们如愿以偿的拿到了 base64 格式的图片,然后复制这段 base64 在浏览器中打开

2b6a8801152e34038fbcb286bc35e61a.png

😬感动 ing,图片显示出来了,于是乎直接改了下 quill 的包代码(这个 quill 和刚才上面展示的不是一个版本),就像下面这样:

7786d4fe6425e97d15e3c9195b8549fd.png

然后我们尝试粘贴,结果如下:

b072e84dd6dd80c14f2e5598f49e8453.png

卧槽,🐂🍺,居然可以,Amazing! 但是好像有哪里不对劲,仔细一看,那个图片居然自己把文字也加上去了,这是什么骚操作,刚才浏览器预览不是还可以的吗😐?思来想去🤔。。。。。。不卖关子了,其实刚才就不行了,让我们把时间往前拨一点,回到图片预览的地方,这回我把背景变成白色了,你就会发现:e6e01f20c26855e210148b27e0412de1.png

这尼玛🙌,一开始就不对(所以和 quill 也就没啥关系了),害我写了半天。万马奔腾之后,还是得静静,想想为啥文字会混入图片呢?这个真不懂,搜了也没有(可能是因为剪贴板的实现机制吧),然后事情就告一段落了(原谅我这么草率😅),因为源头错了,就没有必要往下进行了。

未果而终

虽然结束的有点突然,但是回过头想想,如果图片是对的,这个功能实现起来好像不难,你能实现的话,框架也许就帮你实现了,框架没有处理这种图文逻辑可能就说明这地方有坑,需要警惕。

另外,如果你看的再仔细点,你就会发现我们读取的图片是 png 格式的,而本地资源 file://xxx/clip_image002.gif 确是 gif 的,这就很奇怪了,不过从文件的命名 clip_image002.gif 来看,应该大概可能也许是剪贴板对其做了某种处理吧😂,至于做了啥,就不得而知了。这里顺便打开了这个 file 路径的文件夹,里面的内容如下图所示:985d259c9b74faa8ec837c16e5923b41.png

神奇😳,这里的图片有两种格式,而且都能正确显示,可惜我们不能仅凭这个路径去读取图片,所以还是木有结果。这里又顺便把 word 另存为成 .htm 文件,打开导出的 html 发现其中的图片也是 gif 格式的,就像下图这样:

7fb1b031b34edc8b18d5f7b3ceab4dac.png

不明觉厉😳。。。

最后的最后,我还特意去试了下其他产品的编辑器,看看效果怎么样,还好也不行:d97e0777c0903419f42358ce58c967e9.png

f1fb0a8f9461aded40e81fd4c5528284.png

e2cb268300ab4abb031ac9e005455bd2.png

5199e05ad72402ac412d15cf7dde04b5.png

efeb30a42dcb718b79980412773eeedb.png

不过意外的发现掘金自身的 markdown 居然可以粘贴图文,就像下面这样子:

3e60a64dc0f36e70fc207ffbcd2df2cc.png

刚好和我说的 base64 互补,不过还好结果是一样的,图片一样会包含着文字,这样我就放心了,哈哈哈哈😁😁😁。。。。

😏 听说还能把 word 传给后端解析,再给回前端展示,不过好像有点得不偿失。

🌺如果有大佬知道奇淫巧技的话,欢迎在下面留言。。。

b739ec46bb5c46d9c0aa4ce35ba1ea56.png

关于找一找教程网

本站文章仅代表作者观点,不代表本站立场,所有文章非营利性免费分享。

本站提供了软件编程、网站开发技术、服务器运维、人工智能等等IT技术文章,希望广大程序员努力学习,让我们用科技改变世界。

[关于复制 word 图文到富文本中的问题]http://www.zyiz.net/tech/detail-137604.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值