Vanessa219 / vditor

♏ 一款浏览器端的 Markdown 编辑器,支持所见即所得(富文本)、即时渲染(类似 Typora)和分屏预览模式。An In-browser Markdown editor, support WYSIWYG (Rich Text), Instant Rendering (Typora-like) and Split View modes.
https://b3log.org/vditor
MIT License
8.49k stars 873 forks source link

从剪贴板粘贴图片同时具备 text/html 和 image 类型时,无法触发自动上传 #1652

Closed gkn1234 closed 2 months ago

gkn1234 commented 3 months ago

编辑模式

全部编辑模式

描述问题

在我们的使用场景中,存在从桌面端 APP 拷贝图片到 Vditor 编辑器中的场景,由于桌面端 APP 是通过 electron 开发的,所以粘贴的图片的 type 为 ['text/html', 'image/pmg'],这种情况下,Vditor 编辑器无法上传图片,图片会展示为:

![ ](file:///C:/Users/xxxxxxx/ScreenShot/FC4B7DE3-BCDC-44B1-AE0B-5D5212D39FBF.png)

此用例数据具有下面的特点: 给与以下示例 html

<div id="aaaaa" >sssss</div>

<script>
  const el = document.getElementById('aaaaa')
  el.addEventListener('paste', (e) => {
    console.log('剪贴板内容类型', e.clipboardData.types)
    console.log('html 内容:', e.clipboardData.getData("text/html"))
    console.log('文件内容:', e.clipboardData.files)
    const fileReader = new FileReader();
    fileReader.readAsDataURL(e.clipboardData.files[0]);
    fileReader.onload = () => {
      console.log('文件二进制内容:', fileReader.result.toString())
    }
  })

</script>

输出的内容为: image

原因分析

通过分析 Vditor 的源码,我认为问题出在这里:https://github1s.com/Vanessa219/vditor/blob/master/src/ts/util/fixBrowserBehavior.ts#L1400-L1468

这里的代码逻辑可简化为:

        textHTML = event.clipboardData.getData("text/html");
        textPlain = event.clipboardData.getData("text/plain");
        files = event.clipboardData.files;

        if (textHTML.trim() !== "") {
            // 按 html 内容处理
        } else if (files.length > 0) {
            // 按图片内容处理
            // 上传图片...
        } else if (textPlain.trim() !== "" && files.length === 0) {
            // 按纯文本内容处理
        }

显然,html 内容处理有着最高优先级,使得附带的文件就被忽略了。

期待的结果

由于我们的办公软件为内部版,因此可能不太容易复现。可以尝试从 QQ、钉钉、飞书、微信,复制图片到 Vditor,看看能否复现。

我希望该形式的内容能够正确触发 Vditor 的上传行为。

请评估是否可以调整粘贴方法中,处理文件逻辑和 HTML 逻辑的顺序。

截屏或录像

版本信息

其他信息

Vanessa219 commented 2 months ago

无法上传的话可以使用 linkToImgUrl