农业大数据DedeCMS如何兼容微信公众号图文混排上传?
贵州PHP程序员的CMS编辑器插件大冒险
嘿,各位技术大佬们好!我是贵州山沟沟里爬出来的PHP程序员老王,最近接了个CMS企业官网的外包项目,客户爸爸提出了个"变态"需求——要在UEditor里实现Word/Excel/PPT/PDF一键导入,还要保留各种花里胡哨的格式,连LaTeX公式都要支持!这需求简直比让我用脚写代码还难啊!
需求分析(老板版)
客户说:“我们公司那些50多岁的领导,用Word写个新闻稿都要折腾半天,现在要他们学Markdown?不如让他们去造火箭!你们程序员不就是干这个的吗?给我搞个一键粘贴功能,要像微信复制粘贴那么简单!”
技术选型(穷鬼版)
- 前端:Vue3 CLI(白嫖的)
- 编辑器:UEditor(百度开源的,不要钱)
- 后端:PHP(我的老伙计)
- 存储:阿里云OSS(老板说超过100块就让我用自家硬盘)
- 预算:680元(够买两箱泡面+一箱红牛)
解决方案(山寨版)
前端部分(Vue3插件)
// src/plugins/ueditor-word-import.js
export default {
install(app, options) {
// 注册UEditor插件按钮
UE.registerUI('wordimport', function(editor, uiName) {
const btn = new UE.ui.Button({
name: uiName,
title: 'Word导入',
cssRules: 'background-position: -726px -77px;',
onclick: function() {
// 调用后端API
const input = document.createElement('input');
input.type = 'file';
input.accept = '.doc,.docx,.xls,.xlsx,.ppt,.pptx,.pdf';
input.onchange = async (e) => {
const file = e.target.files[0];
if (!file) return;
const formData = new FormData();
formData.append('file', file);
try {
const res = await fetch('/api/ueditor/import', {
method: 'POST',
body: formData
});
const data = await res.json();
if (data.success) {
editor.execCommand('insertHtml', data.content);
} else {
alert('导入失败:' + data.msg);
}
} catch (err) {
alert('网络错误:' + err.message);
}
};
input.click();
}
});
editor.addListener('ready', function() {
editor.registerButton(uiName, btn);
});
return btn;
}, 10);
}
}
后端部分(PHP处理)
// api/ueditor/import.php
'your-access-key',
'accessKeySecret' => 'your-secret-key',
'endpoint' => 'oss-cn-hangzhou.aliyuncs.com',
'bucket' => 'your-bucket-name'
];
// 接收文件
if (!isset($_FILES['file'])) {
die(json_encode(['success' => false, 'msg' => '没有上传文件']));
}
$file = $_FILES['file'];
$tmpPath = $file['tmp_name'];
$fileName = $file['name'];
$fileExt = strtolower(pathinfo($fileName, PATHINFO_EXTENSION));
// 简单验证文件类型
$allowedTypes = ['doc', 'docx', 'xls', 'xlsx', 'ppt', 'pptx', 'pdf'];
if (!in_array($fileExt, $allowedTypes)) {
die(json_encode(['success' => false, 'msg' => '不支持的文件类型']));
}
// 使用Mammoth.js处理Word(实际项目中应该用PHP库,这里简化处理)
// 实际项目中建议使用PHPWord、PHPExcel等库
function convertWordToHtml($filePath) {
// 这里应该是调用PHP库处理Word的代码
// 由于预算有限,我们假装已经处理好了...
return '转换后的标题这里是转换后的内容';
}
// 处理LaTeX公式(简化版)
function convertLatexToMathml($latex) {
// 实际应该用专业库处理,这里只是示例
$mathml = '' .
'' . htmlspecialchars($latex) . '' .
'';
return $mathml;
}
// 模拟处理过程
$content = '';
switch ($fileExt) {
case 'doc':
case 'docx':
$content = convertWordToHtml($tmpPath);
// 替换模拟的LaTeX公式
$content = preg_replace_callback('/\\\$(.+?)\\\$/', function($matches) {
return convertLatexToMathml($matches[1]);
}, $content);
break;
// 其他文件类型处理...
default:
$content = '暂不支持此文件类型的完整转换';
}
// 上传图片到OSS(简化版)
function uploadToOss($filePath, $originalName) {
global $config;
try {
$ossClient = new OssClient(
$config['accessKeyId'],
$config['accessKeySecret'],
$config['endpoint']
);
$object = 'ueditor/' . uniqid() . '_' . basename($originalName);
$ossClient->uploadFile($config['bucket'], $object, $filePath);
return 'https://' . $config['bucket'] . '.' . $config['endpoint'] . '/' . $object;
} catch (OssException $e) {
return false;
}
}
// 模拟图片处理(实际项目中需要遍历HTML提取图片)
$content .= '';
echo json_encode([
'success' => true,
'content' => $content
]);
?>
部署方案(穷鬼版)
- 买台阿里云ECS最便宜的服务器(99元/年)
- 安装宝塔面板(免费)
- 上传代码到网站目录
- 配置Nginx反向代理
- 申请免费SSL证书(Let’s Encrypt)
- 泡杯茶,等待客户验收
群主の野望
各位大佬,看到这个项目是不是觉得很有前途?现在加入我的QQ群:223813913,不仅能:
- 免费领取1-99元红包(绝对不坑)
- 获得20%推荐提成(躺着赚钱)
- 参与技术讨论(吹牛不上税)
- 获取外包项目(真·有钱一起赚)
算笔账:
- 推荐10个客户 = 2000元提成
- 推荐100个客户 = 20000元提成
- 推荐1000个客户 = 200000元提成(够在贵阳买套房了!)
这比996香多了吧?赶紧加群,错过这村就没这店了!
免责声明
以上代码为简化示例,实际项目中需要:
- 添加完善的错误处理
- 实现真正的文件格式转换
- 加强安全性验证
- 优化性能
- 添加单元测试
但谁让咱们预算只有680元呢?能跑起来就行,要啥自行车!
复制插件目录

引入插件文件
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)