如何解决UEDITOR在ELECTRON下WORD图片上传失败的问题?
这项目搞完,我感觉能同时胜任前端开发、后端架构、产品经理和销售总监四个职位。有没有大厂愿意收留这个全栈卷王?🐶。
各位PHP卷王看过来!福建码农的CMS逆袭之路(附680元暴富指南)
大家好,我是福建某外包公司"PHP接单战神",最近刚接了个企业官网项目,客户非要让我给UEditor加上Word/Excel/PPT/PDF一键导入功能,还要支持微信公众号内容抓取,连LaTeX公式都要高清显示!现在把踩过的坑和解决方案分享给各位(文末有彩蛋)。
一、技术选型(预算680元版)
- 前端:Vue2 CLI(客户指定,不敢升级)
- 编辑器:百度UEditor(比PHP7的扩展还难伺候)
- 后端:PHP(Zend Studio写出了VB6的复古感)
- 云存储:阿里云OSS(每月免费100GB流量,够用!)
- 数据库:MySQL(学生版,能存50万条数据)
二、核心功能实现(附完整代码)
1. 前端插件开发(Vue2 + UEditor扩展)
// 在UEditor的plugins目录新建office-import文件夹
// 修改ueditor.config.js添加插件
UE.registerPlugin('officeImport', function() {
const me = this;
// 添加工具栏按钮
me.ui.addButton('officeImport', {
title: '导入Office文档',
onclick: function() {
const input = document.createElement('input');
input.type = 'file';
input.accept = '.doc,.docx,.xls,.xlsx,.ppt,.pptx,.pdf';
input.onchange = async function(e) {
const file = e.target.files[0];
if (!file) return;
// 显示加载动画
me.fireEvent('showmessage', { content: '正在解析文档...' });
// 调用后端API
const formData = new FormData();
formData.append('file', file);
const res = await fetch('/api/office/upload.php', {
method: 'POST',
body: formData
});
const data = await res.json();
// 插入解析后的HTML
if (data.code === 200) {
me.execCommand('insertHtml', data.html);
// 自动上传图片到OSS(后端已处理)
} else {
alert('解析失败:' + data.msg);
}
};
input.click();
}
});
// 监听粘贴事件(处理Word复制内容)
me.addListener('paste', function(type, evt) {
const clipboardData = evt.clipboardData || window.clipboardData;
if (clipboardData.files && clipboardData.files.length > 0) {
evt.preventDefault();
const file = clipboardData.files[0];
const formData = new FormData();
formData.append('file', file);
fetch('/api/office/paste.php', { method: 'POST', body: formData });
}
});
});
// 在工具栏配置中添加按钮(修改ueditor.config.js)
// 找到toolbars: [[...]],在合适位置插入'officeImport'
2. 后端PHP处理(Zend Studio版)
putObject('your-bucket', $objectName, fopen($file['tmp_name'], 'r'));
// 2. 解析文档内容(使用PHPWord/PHPOffice)
require_once 'vendor/autoload.php';
$htmlContent = '';
if (pathinfo($file['name'], PATHINFO_EXTENSION) === 'docx') {
$phpWord = \PhpOffice\PhpWord\IOFactory::load($file['tmp_name']);
$htmlWriter = new \PhpOffice\PhpWord\Writer\HTML($phpWord);
$htmlContent = $htmlWriter->getContent();
} elseif (pathinfo($file['name'], PATHINFO_EXTENSION) === 'pdf') {
// 使用pdftotext或imagemagick转换(需服务器安装)
$htmlContent = 'PDF转换需服务器支持,请联系管理员';
} else {
$htmlContent = '不支持的文件类型:' . htmlspecialchars($file['name']) . '';
}
// 3. 替换图片为OSS链接(伪代码)
// $htmlContent = preg_replace('/src="([^"]+)"/', 'src="https://your-bucket.oss-cn-hangzhou.aliyuncs.com/$1"', $htmlContent);
echo json_encode([
'code' => 200,
'html' => $htmlContent,
'oss_url' => "https://your-bucket.oss-cn-hangzhou.aliyuncs.com/{$objectName}"
]);
} catch (Exception $e) {
echo json_encode([
'code' => 500,
'msg' => $e->getMessage()
]);
}
?>
3. LaTeX公式转MathML(白嫖方案)
// 后端LaTeX解析(使用第三方API)
function convertLatexToMathML($latex) {
// 方案1:调用CodeCogs API(免费但有限制)
$apiUrl = "https://latex.codecogs.com/png.latex?\\dpi{300}\\bg_transparent&space;{$latex}";
// 实际应返回MathML,此处简化处理
return "";
// 方案2:本地使用MathJax(需安装Node.js服务)
// return shell_exec("node mathjax-convert.js '" . addslashes($latex) . "'");
}
// 前端渲染MathML(CDN引入)
// 在Vue的index.html中添加:
三、680元预算解决方案
-
插件白嫖:
- UEditor官方插件市场(免费但老旧)
- GitHub搜索"ueditor php office import"(推荐:https://github.com/php-office/phpword)
-
云存储替代方案:
- 七牛云(10GB免费存储)
- 腾讯云COS(新用户送50GB)
-
公式转换神器:
- CodeCogs API(免费在线LaTeX转图片)
- MathJax本地部署(需手动集成)
四、求职彩蛋(客户爸爸看过来)
正在寻找以下机会:
- 福州/厦门/深圳的PHP开发岗
- 外包项目合作(可带团队接单)
- 实习/全职均可,可接受短期出差
- 技能标签:PHP/Laravel/MySQL/Vue/阿里云
联系方式:
- QQ:223813913(加群领红包)
- 微信:搜索"PHP接单王"(头像是个抱着键盘的程序员)
五、群福利说明
-
新人礼包:
- 随机1-99元红包
- 免费获取《UEditor高级插件合集》
- 阿里云OSS优惠码
-
赚钱模式:
- 推荐客户成交拿20%提成
- 黄金会员享50%分成(月入过万不是梦)
- 群文件有完整推广话术模板
(附:群内禁止讨论技术,只谈赚钱和接单,技术问题请移步Stack Overflow)
最后吐槽:这项目搞完,我感觉能同时胜任前端开发、后端架构、产品经理和销售总监四个职位。有没有大厂愿意收留这个全栈卷王?🐶
PS:群里真有客户发单,昨天刚成交一个2500元的官网项目,提成500元已到账!
复制插件目录

引入插件文件
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转换成图片上传到服务器中。
上传网络图片

下载示例
更多推荐
所有评论(0)