【网络安全生的逆袭:用ASP.NET WebForm+Vue2搞定Word粘贴神器】
大家好!我是来自贵州某高校网络安全专业的大三"程序猿",正在给我的CMS新闻管理系统装"外挂"——Word一键粘贴全功能支持!今天给大家分享我的升级方案,绝对干货满满!
当前技术栈(穷学生版)
🖥️前端:Vue2 CLI(即将升级Vue3)
✏️编辑器:百度UEditor(老古董的逆袭)
🔙后端:ASP.NET WebForm(经典永流传)
🗃️数据库:MySQL(关系型数据库扛把子)
☁️云存储:阿里云OSS(存图必备)
💻开发环境:VS2022 + 自己的破电脑当服务器
Word一键粘贴全功能方案
前端部分(Vue + UEditor魔改版)
// 在UEditor配置中增加Word粘贴按钮UE.registerUI('wordpaste',function(editor){varbtn=newUE.ui.Button({name:'wordpaste',title:'Word一键粘贴',cssRules:'background-image: url(wordpaste.png) no-repeat;',onclick:function(){// 创建粘贴区域editor.execCommand('insertHtml','请在此粘贴Word内容...');// 监听粘贴事件document.getElementById('word-paste-area').addEventListener('paste',function(e){handleWordPaste(e,editor);},false);}});returnbtn;});// Word内容处理函数asyncfunctionhandleWordPaste(e,editor){e.preventDefault();constclipboardItems=e.clipboardData.items;lethtmlContent=e.clipboardData.getData('text/html');// 1. 处理图片上传constimageUploadPromises=[];for(leti=0;i<clipboardItems.length;i++){if(clipboardItems[i].type.indexOf('image')!==-1){constblob=clipboardItems[i].getAsFile();imageUploadPromises.push(uploadImageToOSS(blob));}}// 2. 等待所有图片上传完成并替换URLconstimageUrls=awaitPromise.all(imageUploadPromises);imageUrls.forEach(url=>{htmlContent=htmlContent.replace(/]*src="[^"]*"[^>]*>/g,match=>match.replace(/(src=")[^"]*(")/,`$1${url}$2`));});// 3. 处理公式(LaTeX转MathML)htmlContent=convertLaTeXToMathML(htmlContent);// 4. 插入处理后的内容editor.execCommand('insertHtml',htmlContent);document.getElementById('word-paste-area').remove();}// 图片上传到阿里云OSSfunctionuploadImageToOSS(blob){returnnewPromise((resolve,reject)=>{constformData=newFormData();formData.append('file',blob);fetch('/api/upload',{method:'POST',body:formData}).then(res=>res.json()).then(data=>resolve(data.url)).catch(reject);});}// LaTeX转MathMLfunctionconvertLaTeXToMathML(html){// 使用MathJax处理consttempDiv=document.createElement('div');tempDiv.innerHTML=html;// 匹配$$公式$$constblockMaths=tempDiv.querySelectorAll('latex-block');blockMaths.forEach(el=>{consttex=el.textContent;el.outerHTML=`$$${tex}$$`;});// 匹配$行内公式$constinlineMaths=tempDiv.querySelectorAll('latex-inline');inlineMaths.forEach(el=>{consttex=el.textContent;el.outerHTML=`$${tex}$`;});returntempDiv.innerHTML;}后端部分(ASP.NET WebForm)
// UploadHandler.ashx 文件上传处理<%@WebHandlerLanguage="C#"Class="UploadHandler"%>usingSystem;usingSystem.Web;usingAliyun.OSS;usingSystem.IO;publicclassUploadHandler:IHttpHandler{publicvoidProcessRequest(HttpContextcontext){context.Response.ContentType="application/json";try{HttpPostedFilefile=context.Request.Files["file"];if(file==null||file.ContentLength==0){thrownewException("请选择上传文件");}// 阿里云OSS配置stringendpoint="your-oss-endpoint";stringaccessKeyId="your-access-key";stringaccessKeySecret="your-secret-key";stringbucketName="your-bucket";// 生成唯一文件名stringext=Path.GetExtension(file.FileName);stringfileName=Guid.NewGuid().ToString()+ext;stringobjectName="uploads/"+DateTime.Now.ToString("yyyyMM")+"/"+fileName;// 上传到OSSvarossClient=newOssClient(endpoint,accessKeyId,accessKeySecret);using(varstream=file.InputStream){varresult=ossClient.PutObject(bucketName,objectName,stream);stringurl=$"https://{bucketName}.{endpoint}/{objectName}";context.Response.Write($"{{\"success\":1,\"url\":\"{url}\"}}");}}catch(Exceptionex){context.Response.Write($"{{\"success\":0,\"message\":\"{ex.Message}\"}}");}}publicboolIsReusable{get{returnfalse;}}}Office文件导入方案(99元预算版)
使用Mammoth.js + SheetJS + PDF.js
// 文件导入处理functionhandleFileImport(file,editor){constreader=newFileReader();reader.onload=function(e){constarrayBuffer=e.target.result;// 根据文件类型选择处理器if(file.name.endsWith('.docx')){importWord(arrayBuffer,editor);}elseif(file.name.endsWith('.xlsx')){importExcel(arrayBuffer,editor);}elseif(file.name.endsWith('.pptx')){importPowerPoint(arrayBuffer,editor);}elseif(file.name.endsWith('.pdf')){importPDF(arrayBuffer,editor);}};reader.readAsArrayBuffer(file);}// Word文档导入asyncfunctionimportWord(arrayBuffer,editor){constresult=awaitmammoth.extractRawText({arrayBuffer});lethtml=result.value;// 处理图片constimages=result.messages.filter(m=>m.type==='image').map(img=>uploadImageFromBase64(img.value));constimageUrls=awaitPromise.all(images);imageUrls.forEach(url=>{html=html.replace(/]*src="[^"]*"[^>]*>/g,match=>match.replace(/(src=")[^"]*(")/,`$1${url}$2`));});editor.execCommand('insertHtml',html);}// Excel导入asyncfunctionimportExcel(arrayBuffer,editor){constworkbook=XLSX.read(arrayBuffer,{type:'array'});consthtml=XLSX.utils.sheet_to_html(workbook.Sheets[workbook.SheetNames[0]]);editor.execCommand('insertHtml',html);}// 数学公式支持document.addEventListener('DOMContentLoaded',function(){MathJax={tex:{inlineMath:[['$','$'],['\$','\$']],displayMath:[['$$','$$'],['\$$','\$$']]},svg:{fontCache:'global'}};constscript=document.createElement('script');script.src='https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-svg.js';document.head.appendChild(script);});99元预算分配建议
💰预算分配方案:
- Mammoth.js商业授权 - 免费(开源版够用)
- SheetJS社区版 - 免费
- PDF.js - 免费
- MathJax - 免费
- 阿里云OSS流量包 - 99元(买个100GB半年包)
技术交流与外包接单(硬核福利)
作为即将毕业的"准社畜",建了个QQ群223813913,来一起:
🚀接外包:1000元的小单子,黄金会员直接拿500!
👥组队参赛:CTF、编程大赛组团开黑
🧠技术交流:解决玄学BUG的神秘力量
📦资源共享:避免重复造轮子
新人福利:
- 🧧 加群红包1-99元(拼手气时间)
- 💰 推荐奖励20%起(最高50%!)
- 🏅 等级晋升制度(青铜→王者)
举个🌰:推荐一个1万的单子,黄金会员直接拿5000!比实习工资香多了吧?当然,技术才是王道,钱只是意外收获😎
求职环节(卑微求内推)
各位大佬师兄师姐:
小弟即将毕业,求个内推机会!技能点:
- .NET全栈开发(WebForm到Core都会)
- Vue全家桶(2和3都玩得转)
- 网络安全基础(毕竟专业是网安)
- 服务器运维(被阿里云折磨出来的经验)
程序员求职秘诀:
“简历造火箭,入职拧螺丝;
面试造航母,工作修单车!”
快来群里一起玩耍吧~ QQ群:223813913
(群内不定期掉落:外包项目、学习资料、面试经验)
复制插件目录
引入插件文件
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"]]初始化控件
varpos=window.location.href.lastIndexOf("/");varapi=[window.location.href.substr(0,pos+1),"asp/upload.asp"].join("");WordPaster.getInstance({//上传接口:http://www.ncmem.com/doc/view.aspx?id=d88b60a2b0204af1ba62fa66288203edPostUrl:api,//为图片地址增加域名:http://www.ncmem.com/doc/view.aspx?id=704cd302ebd346b486adf39cf4553936ImageUrl:"",//设置文件字段名称:http://www.ncmem.com/doc/view.aspx?id=c3ad06c2ae31454cb418ceb2b8da7c45FileFieldName:"file",//提取图片地址:http://www.ncmem.com/doc/view.aspx?id=07e3f323d22d4571ad213441ab8530d1ImageMatch:''});//加载控件注意
如果接口字段名称不是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转换成图片上传到服务器中。
上传网络图片
下载示例
点击下载完整示例