国产化网页编辑器ueditor,粘贴Word图片后怎样上传到云端?

富文本编辑器集成文档处理与图片上传功能开发实录

作为一名独立开发网站的技术人员,我近期正全力攻克富文本编辑器在处理 Word 内容粘贴及多种文档导入时的一系列问题。以下是我详细的查找与开发过程记录。

一、需求精准定位

(一)核心功能需求

  1. 粘贴功能:在百度富文本编辑器 UEditor 中粘贴 Word 内容时,其中的图片需自动上传至服务器,服务器再将图片存储到对象存储(涵盖阿里云、华为云等主流云服务)。同时,要完整保留文档中的样式,包括字体、字号、颜色等关键信息。
  2. 文档导入功能:支持 Word、Excel、PPT、PDF 文档导入到富文本编辑器。导入过程中,图片同样自动上传至服务器并存储到对象存储,且严格保留文档的原始样式。

(二)技术环境说明

  • 前端框架:vue2 - cli
  • 富文本编辑器:百度富文本编辑器 UEditor
  • 后端语言:.NET Core
  • 数据库:SQL Server
  • 服务器:阿里云

二、解决方案查找之旅

(一)在线资源深度挖掘

我充分利用各大技术平台展开搜索,在 优快云、Stack Overflow、GitHub 等网站输入了诸如“UEditor.NET Core 粘贴 Word 图片上传”“vue2 UEditor 文档导入样式保留”“.NET Core 对象存储图片上传”等关键词。

在 GitHub 上,我找到了一些相关的开源项目,但大多只实现了部分功能,例如有的项目仅解决了图片上传问题,却未涉及文档样式保留;有的项目针对特定文档格式,缺乏对多种文档的通用支持。在技术论坛中,一些开发者分享了他们的经验,但大多是零散的思路,缺乏系统性的解决方案。

(二)加入交流群获取实战经验

为了更直接地与同行交流,我加入了 QQ 群 223813913。在群里,我详细描述了项目需求和遇到的问题,得到了众多热心同行的回应。

有同行建议我研究 UEditor 的插件机制,通过自定义插件来实现文档导入和图片上传功能。还有同行分享了他们在.NET Core 中集成对象存储服务的代码示例,这为我解决图片上传到云存储的问题提供了重要参考。

三、开发实战过程

(一)前端部分(vue2 - cli + UEditor)

1. UEditor 集成与初始化

首先,我将 UEditor 的相关文件下载并放置在项目的 public 目录下。在 vue 组件中,通过动态创建 script 标签的方式引入 UEditor 的 JS 文件,并初始化编辑器。




export default {
  mounted() {
    this.loadUEditorScripts();
  },
  methods: {
    loadUEditorScripts() {
      const configScript = document.createElement('script');
      configScript.src = '/ueditor/ueditor.config.js';
      configScript.onload = () => {
        const ueScript = document.createElement('script');
        ueScript.src = '/ueditor/ueditor.all.min.js';
        ueScript.onload = () => {
          this.initEditor();
          this.bindPasteEvent();
        };
        document.body.appendChild(ueScript);
      };
      document.body.appendChild(configScript);
    },
    initEditor() {
      this.ue = UE.getEditor('editor');
    },
    bindPasteEvent() {
      this.ue.addListener('ready', () => {
        this.ue.addListener('afterPaste', this.handlePaste);
      });
    },
    handlePaste(html) {
      console.log('粘贴内容:', html);
      // 此处将添加代码来处理粘贴内容中的图片上传和样式保留
    }
  }
};

2. 粘贴事件处理与图片上传

为了实现粘贴 Word 图片自动上传,我在 afterPaste 事件处理函数中,使用 DOMParser 解析粘贴的 HTML 内容,提取其中的图片元素。对于 base64 编码的图片,我调用后端接口进行上传。

handlePaste(html) {
  const parser = new DOMParser();
  const doc = parser.parseFromString(html, 'text/html');
  const images = doc.querySelectorAll('img');
  images.forEach(img => {
    if (img.src.startsWith('data:image')) {
      this.uploadBase64Image(img.src);
    }
  });
},
uploadBase64Image(base64Data) {
  const matches = base64Data.match(/^data:(.+);base64,(.+)$/);
  if (matches && matches.length === 3) {
    const mimeType = matches[1];
    const imageData = matches[2];
    this.$http.post('/api/uploadImage', {
      imageData: imageData,
      mimeType: mimeType
    }).then(response => {
      console.log('图片上传成功:', response.data);
      // 后续需要替换编辑器中的图片链接为上传后的链接
    }).catch(error => {
      console.error('图片上传失败:', error);
    });
  }
}
3. 文档导入功能实现

对于文档导入,我使用了不同的库来处理不同格式的文档。以 Word 文档为例,我使用 mammoth.js 进行解析。在前端添加文件上传按钮,当用户选择 Word 文件后,使用 FileReader 读取文件内容,调用 mammoth.js 解析,并将解析后的 HTML 内容插入到 UEditor 中。




import mammoth from'mammoth';

export default {
  methods: {
    handleWordFileChange(event) {
      const file = event.target.files[0];
      if (file) {
        const reader = new FileReader();
        reader.onload = (e) => {
          const arrayBuffer = e.target.result;
          mammoth.convertToHtml({ arrayBuffer: arrayBuffer })
           .then(result => {
              this.ue.setContent(result.value);
              this.processImportedImages(result.value);
            })
           .catch(error => {
              console.error('Word 文档解析失败:', error);
            });
        };
        reader.readAsArrayBuffer(file);
      }
    },
    processImportedImages(html) {
      // 处理导入文档中的图片,类似于粘贴事件中的图片处理逻辑
    }
  }
};

对于 Excel、PPT 和 PDF 文档,我分别使用了 SheetJS、pptxjs 和 pdf.js 进行解析,处理逻辑与 Word 文档类似。

(二)后端部分(.NET Core)

1. 图片上传接口开发

我创建了一个.NET Core Web API 项目来处理图片上传请求。接口接收到前端上传的图片 base64 数据和图片类型后,将 base64 数据解码为二进制数据,然后上传到阿里云对象存储(OSS)。

using Microsoft.AspNetCore.Mvc;
using Aliyun.OSS;
using System;
using System.IO;
using System.Threading.Tasks;

[ApiController]
[Route("api/[controller]")]
public class UploadController : ControllerBase
{
    private readonly string accessKeyId = "your-access-key-id";
    private readonly string accessKeySecret = "your-access-key-secret";
    private readonly string endpoint = "your-oss-endpoint";
    private readonly string bucketName = "your-bucket-name";

    [HttpPost("uploadImage")]
    public async Task UploadImage([FromBody] ImageUploadModel model)
    {
        try
        {
            byte[] imageBytes = Convert.FromBase64String(model.ImageData);
            string fileName = Guid.NewGuid().ToString() + Path.GetExtension(GetFileExtensionFromMimeType(model.MimeType));

            var client = new OssClient(endpoint, accessKeyId, accessKeySecret);
            client.PutObject(bucketName, fileName, new MemoryStream(imageBytes));

            string objectUrl = $"https://{bucketName}.{endpoint}/{fileName}";
            return Ok(new { url = objectUrl });
        }
        catch (Exception ex)
        {
            return BadRequest(new { error = ex.Message });
        }
    }

    private string GetFileExtensionFromMimeType(string mimeType)
    {
        switch (mimeType)
        {
            case "image/jpeg":
                return ".jpg";
            case "image/png":
                return ".png";
            case "image/gif":
                return ".gif";
            default:
                return ".dat";
        }
    }
}

public class ImageUploadModel
{
    public string ImageData { get; set; }
    public string MimeType { get; set; }
}
2. 文档导入辅助接口(预留)

为了支持文档导入后的数据处理和存储,我预留了一些接口,例如将文档信息存储到 SQL Server 数据库的接口。目前这部分功能还在进一步完善中。

四、问题攻坚与解决

(一)图片上传格式错误

在开发过程中,遇到了图片上传后格式错误的问题。经过排查,发现是 base64 数据解码时出现了异常。原因是前端传输的 base64 数据可能包含换行符等特殊字符,导致解码失败。解决方法是在前端传输前对 base64 数据进行清理,去除不必要的字符。

(二)文档样式丢失

在导入文档时,发现部分样式丢失。经过分析,发现是文档解析库对某些样式的支持不够完善。对于 Word 文档,我调整了 mammoth.js 的解析配置,尽量保留更多的样式信息。对于其他文档格式,我计划进一步研究解析库的文档,寻找更好的样式保留方法。

五、总结与展望

通过这段时间的努力,我已经基本实现了富文本编辑器中粘贴 Word 图片自动上传以及多种文档导入的功能,但在样式保留和稳定性方面还有待提高。在与同行的交流和开发过程中,我积累了宝贵的经验,也认识到了自己的不足之处。

接下来,我将继续优化文档导入功能,确保各种文档的样式能够完整保留,并提高图片上传和文档导入的稳定性。同时,我也会将开发过程中的经验整理成文档,分享给更多的开发者,希望能为大家提供一些参考和帮助。

复制插件目录

image

引入插件文件


	
	UEditor 1.4.3.3示例
	
    
	
	
    
    
    
    
    
    
	
    

注意:不要重复引入jquery,如果您的项目已经引入了jq,则不用再引入jq-1.4
image

在工具栏中增加插件按钮

//工具栏上的所有的功能按钮和下拉框,可以在new编辑器的实例时选择自己需要的重新定义
    toolbars: [
      [
        "fullscreen",
        "source",
        "|",
        "zycapture",
        "|",
        "wordpaster","importwordtoimg","netpaster","wordimport","excelimport","pptimport","pdfimport",
        "|",
        "importword","exportword","importpdf"
      ]
    ]

初始化控件

image

        var pos = window.location.href.lastIndexOf("/");
        var api = [
            window.location.href.substr(0, pos + 1),
            "asp/upload.asp"
        ].join("");
        WordPaster.getInstance({
			//上传接口:http://www.ncmem.com/doc/view.aspx?id=d88b60a2b0204af1ba62fa66288203ed
            PostUrl: api,
			//为图片地址增加域名:http://www.ncmem.com/doc/view.aspx?id=704cd302ebd346b486adf39cf4553936
            ImageUrl: "",
            //设置文件字段名称:http://www.ncmem.com/doc/view.aspx?id=c3ad06c2ae31454cb418ceb2b8da7c45
            FileFieldName: "file",
            //提取图片地址:http://www.ncmem.com/doc/view.aspx?id=07e3f323d22d4571ad213441ab8530d1
            ImageMatch: ''			
        });//加载控件

注意

如果接口字段名称不是file,请配置FileFieldName。ueditor接口中使用的upfile字段
image
点击查看详细教程

配置ImageMatch

匹配图片地址,如果服务器返回的是JSON则需要通过正则匹配

ImageMatch: '',

点击参考链接

配置ImageUrl

为图片地址增加域名,如果服务器返回的图片地址是相对路径,可通过此属性添加自定义域名。

ImageUrl: "",

点击查看详细教程

配置SESSION

如果接口有权限验证(登陆验证,SESSION验证),请配置COOKIE。或取消权限验证。
参考:http://www.ncmem.com/doc/view.aspx?id=8602DDBF62374D189725BF17367125F3

效果

编辑器界面

image

导入Word文档,支持doc,docx

粘贴Word和图片

导入Excel文档,支持xls,xlsx

粘贴Word和图片

粘贴Word

一键粘贴Word内容,自动上传Word中的图片,保留文字样式。
粘贴Word和图片

Word转图片

一键导入Word文件,并将Word文件转换成图片上传到服务器中。
导入Word转图片

导入PDF

一键导入PDF文件,并将PDF转换成图片上传到服务器中。
导入PDF转图片

导入PPT

一键导入PPT文件,并将PPT转换成图片上传到服务器中。
导入PPT转图片

上传网络图片

自动上传网络图片

下载示例

点击下载完整示例

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值