贵州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
]);
?>

部署方案(穷鬼版)

  1. 买台阿里云ECS最便宜的服务器(99元/年)
  2. 安装宝塔面板(免费)
  3. 上传代码到网站目录
  4. 配置Nginx反向代理
  5. 申请免费SSL证书(Let’s Encrypt)
  6. 泡杯茶,等待客户验收

群主の野望

各位大佬,看到这个项目是不是觉得很有前途?现在加入我的QQ群:223813913,不仅能:

  1. 免费领取1-99元红包(绝对不坑)
  2. 获得20%推荐提成(躺着赚钱)
  3. 参与技术讨论(吹牛不上税)
  4. 获取外包项目(真·有钱一起赚)

算笔账:

  • 推荐10个客户 = 2000元提成
  • 推荐100个客户 = 20000元提成
  • 推荐1000个客户 = 200000元提成(够在贵阳买套房了!)

这比996香多了吧?赶紧加群,错过这村就没这店了!

免责声明

以上代码为简化示例,实际项目中需要:

  1. 添加完善的错误处理
  2. 实现真正的文件格式转换
  3. 加强安全性验证
  4. 优化性能
  5. 添加单元测试

但谁让咱们预算只有680元呢?能跑起来就行,要啥自行车!

复制插件目录

WordPaster插件目录

引入插件文件


	
	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转图片

上传网络图片

自动上传网络图片

下载示例

点击下载完整示例

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐