富文本编辑器集成文档导入与图片自动上传功能开发记录
作为一名技术开发人员,我独立搭建了一个网站,目前正着手解决富文本编辑器中粘贴 Word 图片以及支持多种文档导入且图片自动上传至服务器的问题。以下是我详细的查找过程与开发记录。
一、需求明确
(一)功能需求
(二)技术环境
- 前端框架:vue2 – cli
- 富文本编辑器:百度富文本编辑器 UEditor
- 后端语言:PHP
- 数据库:MySQL
- 服务器:阿里云
二、查找解决方案
(一)在线资源搜索
我首先在各大技术论坛(如 CSDN、掘金)、开源社区(GitHub、Gitee)以及搜索引擎(百度、谷歌)上进行了广泛搜索。输入的关键词包括“UEditor 粘贴 Word 图片自动上传”“UEditor 导入 Word Excel PPT PDF 文档”“vue2 UEditor 文档导入图片上传”等。
在搜索过程中,我发现了一些相关的讨论和技术文章,但大多只是提到了部分功能的实现思路,缺乏完整的代码示例和详细的实现步骤。例如,有些文章介绍了如何通过修改 UEditor 的配置来实现粘贴图片的自动上传,但没有涉及到多种文档导入以及图片上传到对象存储的具体操作。
(二)加入交流群
为了能更直接地与同行交流经验,我加入了 QQ 群 223813913。在群里,我向大家描述了目前遇到的问题和需求,得到了不少热心同行的回应。
有同行建议我参考 UEditor 官方文档中关于自定义插件和后端接口的部分,通过编写自定义插件来实现文档导入和图片上传的功能。还有同行分享了他们之前类似项目的开发经验,提醒我注意文档格式解析的兼容性问题以及图片上传过程中的安全性问题。
三、开发过程
(一)前端部分(vue2 – cli + UEditor)
1. 引入 UEditor
在 vue2 项目中引入 UEditor,我按照官方文档的步骤进行了配置。首先下载 UEditor 的压缩包,解压后将相关文件放置在项目的 public 目录下。然后在 vue 组件中通过动态创建 script 标签的方式引入 UEditor 的 JS 文件,并初始化编辑器。
export default {
mounted() {
this.initUEditor();
},
methods: {
initUEditor() {
const script = document.createElement('script');
script.src = '/ueditor/ueditor.config.js';
script.onload = () => {
const ueScript = document.createElement('script');
ueScript.src = '/ueditor/ueditor.all.min.js';
ueScript.onload = () => {
this.ue = UE.getEditor('editor');
this.bindPasteEvent();
};
document.body.appendChild(ueScript);
};
document.body.appendChild(script);
},
bindPasteEvent() {
this.ue.addListener('ready', () => {
this.ue.addListener('afterPaste', this.handlePaste);
});
},
handlePaste(html) {
// 处理粘贴内容,提取图片并上传
console.log('粘贴内容:', html);
// 这里可以添加代码来解析 html 中的图片并触发上传
}
}
};
2. 处理粘贴事件
为了实现粘贴 Word 图片自动上传,我监听了 UEditor 的 afterPaste 事件。在事件处理函数中,需要对粘贴的 HTML 内容进行分析,提取出其中的图片元素。由于 Word 粘贴过来的图片可能是以 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')) {
// 处理 base64 编码的图片
this.uploadBase64Image(img.src);
} else {
// 处理外部链接图片(这里可能需要根据实际情况进一步处理,比如判断是否为合法链接等)
console.log('外部链接图片:', img.src);
}
});
},
uploadBase64Image(base64Data) {
// 提取 base64 数据中的图片类型和纯数据部分
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. 文档导入功能
对于文档导入功能,由于 UEditor 本身并不直接支持多种文档的导入,因此需要借助第三方库来进行文档解析。我选择了 mammoth.js 来解析 Word 文档,对于 Excel、PPT 和 PDF,考虑使用相应的解析库(如 SheetJS 解析 Excel,pptxjs 解析 PPT,pdf.js 解析 PDF)。
以 Word 文档导入为例,我在前端添加了一个文件上传按钮,当用户选择 Word 文件后,使用 FileReader 读取文件内容,然后调用 mammoth.js 进行解析,将解析后的 HTML 内容插入到 UEditor 中。
import mammoth from'mammoth';
export default {
methods: {
handleFileChange(event) {
const file = event.target.files[0];
if (file) {
const reader = new FileReader();
reader.onload = (e) => {
const arrayBuffer = e.target.result;
mammoth.extractRawText({ arrayBuffer: arrayBuffer })
.then(result => {
// 这里只是简单获取文本内容,实际需要获取包含样式的 HTML
// 更完整的做法是使用 mammoth.convertToHtml
mammoth.convertToHtml({ arrayBuffer: arrayBuffer })
.then(htmlResult => {
this.ue.setContent(htmlResult.value);
// 处理导入文档中的图片(如果有)
this.processImportedImages(htmlResult.value);
});
})
.catch(error => {
console.error('文档解析失败:', error);
});
};
reader.readAsArrayBuffer(file);
}
},
processImportedImages(html) {
// 类似于粘贴事件处理中的图片处理逻辑
// 解析 html 中的图片并上传
}
}
};
(二)后端部分(PHP)
1. 图片上传接口
我编写了一个 PHP 接口来处理前端上传的图片数据。接口接收到图片的 base64 编码数据和图片类型后,将 base64 数据解码为二进制数据,然后上传到阿里云对象存储(OSS)。
'Base64 解码失败']);
exit;
}
try {
// 创建 OssClient 实例
$ossClient = new OssClient($accessKeyId, $accessKeySecret, $endpoint);
// 生成图片文件名
$fileName = uniqid(). '.'. pathinfo(parse_url($mimeType, PHP_URL_PATH), PATHINFO_EXTENSION);
// 上传图片到 OSS
$ossClient->putObject($bucket, $fileName, $binaryData);
// 返回图片的 OSS 访问链接
$objectUrl = 'https://'. $bucket. '.'. $endpoint. '/'. $fileName;
echo json_encode(['url' => $objectUrl]);
} catch (OssException $e) {
echo json_encode(['error' => $e->getMessage()]);
}
?>
2. 文档导入相关接口(预留)
对于文档导入功能,后端可能需要提供一些辅助接口,例如处理文档解析后的数据、存储文档相关信息到 MySQL 数据库等。目前这部分功能还在进一步完善中。
四、遇到的问题与解决方案
(一)图片上传失败
在开发过程中,遇到了图片上传失败的问题。经过排查,发现是由于阿里云 OSS 的权限配置不正确导致的。解决方法是检查并修改 OSS 的 Bucket 权限,确保 PHP 脚本有足够的权限进行文件上传操作。
(二)文档样式丢失
在导入 Word 文档时,发现部分样式(如字体、字号、颜色等)丢失。这是因为使用的文档解析库(mammoth.js)在解析过程中对样式的支持不够完善。解决方案是寻找更强大的文档解析库或者对解析后的 HTML 进行二次处理,手动添加丢失的样式。
五、总结与展望
通过这段时间的查找和开发,我已经基本实现了富文本编辑器中粘贴 Word 图片自动上传以及 Word 文档导入的功能,但 Excel、PPT 和 PDF 文档的导入功能还在进一步完善中。在开发过程中,与同行的交流和分享给了我很多帮助,让我能够更快地解决问题。
接下来,我将继续优化文档导入功能,确保各种文档的样式能够完整保留,并提高图片上传的稳定性和性能。同时,我也会将开发过程中的经验整理成文档,分享给更多的开发者,希望能为大家提供一些参考和帮助。
复制插件目录
引入插件文件
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转换成图片上传到服务器中。
上传网络图片
下载示例
点击下载完整示例
评论前必须登录!
注册