瑞士RTDT Laboratories获400万美元融资,无线智能传感贴片助力风电行业提效
2026/7/22 2:13:09
作为安徽IT行业的.NET工程师,我近期接到了一个企业网站后台管理系统的功能扩展需求,需要在现有UEditor基础上增加Word粘贴和文档导入功能。经过评估,我制定了以下技术方案:
// src/plugins/ueditor/plugins/wordpaste.jsUE.plugin.register('wordpaste',function(){varme=this;return{commands:{'wordpaste':{execCommand:function(){// 创建隐藏的textarea用于接收粘贴内容varhiddenInput=document.createElement('textarea');hiddenInput.style.position='absolute';hiddenInput.style.left='-9999px';document.body.appendChild(hiddenInput);hiddenInput.focus();// 监听粘贴事件document.addEventListener('paste',functionpasteHandler(e){document.removeEventListener('paste',pasteHandler);// 处理粘贴内容varitems=(e.clipboardData||window.clipboardData).items;varblob=null;// 检查是否有图片for(vari=0;i<items.length;i++){if(items[i].type.indexOf('image')!==-1){blob=items[i].getAsFile();break;}}// 如果有图片,先上传图片if(blob){varformData=newFormData();formData.append('file',blob);fetch('/api/upload/image',{method:'POST',body:formData}).then(response=>response.json()).then(data=>{// 图片上传完成,插入到编辑器me.execCommand('insertimage',{src:data.url,_src:data.url});// 处理文本内容processTextContent(e);});}else{// 直接处理文本内容processTextContent(e);}// 移除临时元素document.body.removeChild(hiddenInput);});},queryCommandState:function(){returnme.queryCommandState('paste');}}}};});// WordCleanHandler.ashx<%@WebHandlerLanguage="C#"Class="WordCleanHandler"%>usingSystem;usingSystem.Web;usingSystem.IO;usingSystem.Text.RegularExpressions;usingNewtonsoft.Json;publicclassWordCleanHandler:IHttpHandler{publicvoidProcessRequest(HttpContextcontext){context.Response.ContentType="application/json";try{// 读取请求体stringrequestBody;using(varreader=newStreamReader(context.Request.InputStream)){requestBody=reader.ReadToEnd();}varrequest=JsonConvert.DeserializeObject(requestBody);// 清理Word HTMLstringcleanHtml=CleanWordHtml(request.Html);// 返回清理后的HTMLcontext.Response.Write(JsonConvert.SerializeObject(new{success=true,cleanHtml=cleanHtml}));}}publicboolIsReusable=>false;}import { ref } from 'vue'; import { ElMessage } from 'element-plus'; export default { name: 'WordImport', emits: ['import-success'], setup(props, { emit }) { const fileInput = ref(null); const importing = ref(false); const progress = ref(0); const statusMessage = ref(''); const triggerFileInput = () => { fileInput.value.click(); }; const handleFileChange = (e) => { const file = e.target.files[0]; if (!file) return; importDocument(file); }; const importDocument = async (file) => { importing.value = true; progress.value = 0; statusMessage.value = '正在上传文档...'; try { const formData = new FormData(); formData.append('file', file); // 上传文档 const uploadResponse = await fetch('/api/document/upload', { method: 'POST', body: formData }); const uploadResult = await uploadResponse.json(); if (!uploadResult.success) { throw new Error(uploadResult.message || '文档上传失败'); } statusMessage.value = '正在解析文档内容...'; progress.value = 50; // 解析文档内容 const parseResponse = await fetch('/api/document/parse', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ fileId: uploadResult.fileId, fileName: file.name }) }); } catch (error) { ElMessage.error(error.message); importing.value = false; fileInput.value.value = ''; } }; return { fileInput, triggerFileInput, handleFileChange, importing, progress, statusMessage }; } };// DocumentUploadHandler.ashx<%@WebHandlerLanguage="C#"Class="DocumentUploadHandler"%>usingSystem;usingSystem.Web;usingSystem.IO;usingSystem.Threading.Tasks;usingNewtonsoft.Json;usingAliyun.OSS;publicclassDocumentUploadHandler:IHttpHandler{privatereadonlystring_ossEndpoint="your-oss-endpoint";privatereadonlystring_ossAccessKeyId="your-access-key-id";privatereadonlystring_ossAccessKeySecret="your-access-key-secret";privatereadonlystring_ossBucketName="your-bucket-name";privatereadonlystring_tempFolder="~/App_Data/Temp/";publicvoidProcessRequest(HttpContextcontext){context.Response.ContentType="application/json";try{varfile=context.Request.Files[0];if(file.ContentLength==0){thrownewException("上传文件为空");}// 确保临时文件夹存在vartempPath=context.Server.MapPath(_tempFolder);if(!Directory.Exists(tempPath)){Directory.CreateDirectory(tempPath);}// 生成唯一文件名varfileExt=Path.GetExtension(file.FileName);varnewFileName=Guid.NewGuid().ToString()+fileExt;varfilePath=Path.Combine(tempPath,newFileName);// 保存文件到临时位置file.SaveAs(filePath);// 上传到OSSvarossClient=newOssClient(_ossEndpoint,_ossAccessKeyId,_ossAccessKeySecret);varobjectName="temp/documents/"+newFileName;using(varfileStream=File.OpenRead(filePath)){ossClient.PutObject(_ossBucketName,objectName,fileStream);}}catch(Exceptionex){}}publicboolIsReusable=>false;}// 在UEditor配置文件中添加自定义按钮// src/plugins/ueditor/ueditor.config.jsUE.registerUI('wordpaste',function(editor,uiName){// 创建按钮varbtn=newUE.ui.Button({name:uiName,title:'Word粘贴',onclick:function(){editor.execCommand('wordpaste');},cssRules:'background-position: -401px -40px;'});// 添加到工具栏editor.addListener('ready',function(){editor.ui.addToolbarButton(btn);});returnbtn;});// 在UEditor配置中启用自定义插件UE.Editor.prototype.plugins['wordpaste']=function(){// 插件初始化代码};前端部署:
后端部署:
数据库配置:
CREATETABLEDocumentImportHistory(IdINTPRIMARYKEYIDENTITY(1,1),FileName NVARCHAR(255),FileSizeINT,FileType NVARCHAR(50),ImportTimeDATETIMEDEFAULTGETDATE(),UserIdINT,-- 关联到用户表StatusNVARCHAR(50),Message NVARCHAR(MAX));为了更好地支持这个功能的实现和维护,我建议加入我们的QQ群:223813913。在群里您可以:
我们还会不定期分享:
为了控制在2万预算内,建议:
文档转换库选择:
开发策略:
云存储成本:
这个方案提供了完整的前后端实现,可以无缝集成到现有系统中,满足客户从Word粘贴和文档导入的需求,同时保持图片自动上传到云存储的功能。
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字段
点击查看详细教程
匹配图片地址,如果服务器返回的是JSON则需要通过正则匹配
ImageMatch:'',点击参考链接
为图片地址增加域名,如果服务器返回的图片地址是相对路径,可通过此属性添加自定义域名。
ImageUrl:"",点击查看详细教程
如果接口有权限验证(登陆验证,SESSION验证),请配置COOKIE。或取消权限验证。
参考:http://www.ncmem.com/doc/view.aspx?id=8602DDBF62374D189725BF17367125F3
一键粘贴Word内容,自动上传Word中的图片,保留文字样式。
一键导入Word文件,并将Word文件转换成图片上传到服务器中。
一键导入PDF文件,并将PDF转换成图片上传到服务器中。
一键导入PPT文件,并将PPT转换成图片上传到服务器中。
点击下载完整示例