富文本编辑器集成文档处理与图片上传功能开发实录
作为一名独立开发网站的技术人员,我近期正全力攻克富文本编辑器在处理 Word 内容粘贴及多种文档导入时的一系列问题。以下是我详细的查找与开发过程记录。
一、需求精准定位
(一)核心功能需求
- 粘贴功能:在百度富文本编辑器 UEditor 中粘贴 Word 内容时,其中的图片需自动上传至服务器,服务器再将图片存储到对象存储(涵盖阿里云、华为云等主流云服务)。同时,要完整保留文档中的样式,包括字体、字号、颜色等关键信息。
- 文档导入功能:支持 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 图片自动上传以及多种文档导入的功能,但在样式保留和稳定性方面还有待提高。在与同行的交流和开发过程中,我积累了宝贵的经验,也认识到了自己的不足之处。
接下来,我将继续优化文档导入功能,确保各种文档的样式能够完整保留,并提高图片上传和文档导入的稳定性。同时,我也会将开发过程中的经验整理成文档,分享给更多的开发者,希望能为大家提供一些参考和帮助。
复制插件目录
引入插件文件
UEditor 1.4.3.3示例
注意:不要重复引入jquery,如果您的项目已经引入了jq,则不用再引入jq-1.4
在工具栏中增加插件按钮
//工具栏上的所有的功能按钮和下拉框,可以在new编辑器的实例时选择自己需要的重新定义
toolbars: [
[
"fullscreen",
"source",
"|",
"zycapture",
"|",
"wordpaster","importwordtoimg","netpaster","wordimport","excelimport","pptimport","pdfimport",
"|",
"importword","exportword","importpdf"
]
]
初始化控件
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字段
点击查看详细教程
配置ImageMatch
匹配图片地址,如果服务器返回的是JSON则需要通过正则匹配
ImageMatch: '',
配置ImageUrl
为图片地址增加域名,如果服务器返回的图片地址是相对路径,可通过此属性添加自定义域名。
ImageUrl: "",
配置SESSION
如果接口有权限验证(登陆验证,SESSION验证),请配置COOKIE。或取消权限验证。
参考:http://www.ncmem.com/doc/view.aspx?id=8602DDBF62374D189725BF17367125F3
效果
编辑器界面
导入Word文档,支持doc,docx
导入Excel文档,支持xls,xlsx
粘贴Word
一键粘贴Word内容,自动上传Word中的图片,保留文字样式。
Word转图片
一键导入Word文件,并将Word文件转换成图片上传到服务器中。
导入PDF
一键导入PDF文件,并将PDF转换成图片上传到服务器中。
导入PPT
一键导入PPT文件,并将PPT转换成图片上传到服务器中。