富文本编辑器 从word中复制内容带多张图片

技术富文本编辑器 从word中复制内容带多张图片 富文本编辑器 从word中复制内容带多张图片?
1.4.2之后官方并没有做功能的改动,1.4.2在word复制这块没有bug,其他版本会出现手动无法转存

富文本编辑器从word复制包含多个图片的内容。

1.4.2之后官方没有做任何功能上的改动。1 . 4 . 2 word复制没有bug,其他版本不能手动转移。

本文的背景是Java。前端是Jsp(前端是一样的,如果语言不合理后台可以自己做Base64编解码)

因为公司业务需要支持IE8,所以网上其实有很多富文本框,效果很好。

例如,Www.wangEditor.com在尝试了一圈后不支持IE8。

所以回到Ueditor,因为没有官方维护,新的neuditor不知道什么时候能支持自动转字,只能自己想办法。

如果没有必要,不建议使用Ueditor。我也没办法。

修改后的插件只适合IE8。

这里需要注意的一点是,百度官方编辑器不支持文字图片批量传输。粘贴word后,需要手动选择图片,再次上传。网上找到的例子大部分都是这个操作。如果需要批量自动上传word图片,可以使用WordPaster控件。

1.工业工程设置

将可信网站添加到可信网站。

这里的原生测试直接使用http://localhost。

因为需要读取客户端的文件,所以需要设置访问数据源的权限。

ActiveXObject设置可以在线参考,这里没有列出。

以前的

这里,IE的准备工作已经完成。

修改ueditor.all.js的关键代码

在第1006行附近,如果是ueditor的另一个版本,如果功能正常,可以复制下面的代码。

var imgPath=attrs.src

var imgUrl=attrs.src

if(navigator . appname==' Microsoft Internet Explorer '){//判断是否为IE浏览器。

if(navigator . user agent . match(/Trident/I)navigator . user agent . match(/msie 8.0/I)){//判断浏览器内核是否为Trident内核ie8.0。

var real path=IMgpath . substring(8,IMgpath . length);

var filename=IMgpath . substring(IMgpath . LastIndex of('/')1,IMgpath . length);

var result=uploadforie . save attachment(文件名,真实路径);

if(结果){ 0

var JSON=eval('(' result ')');

imgUrl=json.url

}

}

}

img . SetAttr({ 0

宽度: attrs.width,

高度: attrs.height,

alt: attrs.alt,

word_img: attrs.src,

src: imgUrl,

style ' : ' background : URL('(flag opt . theme path opt . theme '/images/word . gif ' : opt . lang path opt . lang '/images/local image . png ')')无重复居中;border:1px实心#ddd '

})

uploadForIE.js .

var UploadForIE={

//保存为xml附件,通过ajax上传。

保存附件:函数(上传_文件名,本地文件路径){ 0

//后台接受图片保存的方法。

var upload _ target _ URL=' uploadImg ';

var strTempFile=localFilePath

//创建XML对象并组合XML文档数据

var XML _ DOM=uploadforie . create document();

xml_dom.loadXML('xml版本='1.0 '编码='GBK '根/');

//创建ADODB。流对象

var ado _ stream=newactivexoobject(' adodb . stream ');

//将流数据类型设置为二进制类型。

ado_stream。type=1;//adTypeBinary

//打开ADODB。溪流

对象

ado_stream.Open();

//将本地文件装载到ADODB.Stream对象中

ado_stream.LoadFromFile(strTempFile);

//获取文件大小(以字节为单位)

var byte_size=ado_stream.Size;

//设置数据传输单元大小为1KB

var byte_unit=1024;

//获取文件分割数据单元的数量

var read_count=parseInt((byte_size/byte_unit).toString())+parseInt(((byte_size%byte_unit)==0)0:1);

//创建XML元素节点,保存上传文件名称

var node=xml_dom.createElement("uploadFilename");

node.text=upload_filename.toString();

var root=xml_dom.documentElement;

root.appendChild(node);

//创建XML元素节点,保存上传文件大小

var node=xml_dom.createElement("uploadFileSize");

node.text=byte_size.toString();

root.appendChild(node);

//创建XML元素节点,保存上传文件内容

for(var i=0;iread_count;i++){

var node=xml_dom.createElement("uploadContent");

//文件内容编码方式为Base64

node.dataType="bin.base64";

//判断当前保存的数据节点大小,根据条件进行分类操作

if((parseInt(byte_size%byte_unit)!=0)(i==parseInt(read_count-1))){

//当数据包大小不是数据单元的整数倍时,读取最后剩余的小于数据单元的所有数据

node.nodeTypedValue=ado_stream.Read();

}else{

//读取一个完整数据单元的数据

node.nodeTypedValue=ado_stream.Read(byte_unit);

}

root.appendChild(node);

}

//关闭ADODB.Stream对象

ado_stream.Close();

delete ado_stream;

//创建Microsoft.XMLHTTP对象

// var xmlhttp = new ActiveXObject("microsoft.xmlhttp");

var xmlhttp=window.XMLHttpRequestnewXMLHttpRequest():newActiveXObject("Microsoft.XMLHttp");

//打开Microsoft.XMLHTP对象

xmlhttp.open("post",upload_target_url,false);

//使用Microsoft.XMLHTP对象上传文件

xmlhttp.send(xml_dom);

var state=xmlhttp.readyState;

var success_state=true;

if(state!=4){

success_state=false;

}

var result=xmlhttp.responseText;

delete xmlhttp;

returnresult;

},

//创建DOMdocuemnt

createDocument:function(){

var xmldom;

var versions=["MSXML2.DOMDocument.6.0","MSXML2.DOMDocument.5.0","MSXML2.DOMDocument.4.0","MSXML2.DOMDocument.3.0","MSXML2.DOMDocument"],

i,

len;

for(i=0,len=versions.length;ilen;i++){

try{

xmldom=newActiveXObject(versions[i]);

if(xmldom!=null)break;

}catch(ex){

//跳过

alert("创建document对象失败!");

}

}

returnxmldom;

}

}

UEditorAction保存图片方法

@RequestMapping("/uploadImg")

publicvoiduploadADO(HttpServletRequest request,HttpServletResponse response){

String path1=request.getContextPath();

String basePath=request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path1;

String rootPath=request.getServletContext().getRealPath("/");

//设置数据传输单元大小为1KB

intunit_size=1024;

//初始化xml文件大小(以字节为单位)

intxmlFileSize=0;

//初始化上传文件名称(完整文件名)

String xmlFilename="";

//初始化上传文件保存路径(绝对物理路径)

String xmlFilepath="";

//声明文件存储字节数组

byte[]xmlFileBytes=null;

try{

//初始化 SAX 串行xml文件解析器

SAXBuilder builder=newSAXBuilder();

Document doc=builder.build(request.getInputStream());

Element eRoot=doc.getRootElement();

//获取上传文件的完整名称

Iterator it_name=eRoot.getChildren("uploadFilename").iterator();

if(it_name.hasNext()){

xmlFilename=((Element)it_name.next()).getText();

}

//存放的相对路径目录

String relativePath="/temp/"+EditorUtil.getToday()+"/";

xmlFilepath=rootPath+relativePath;

//获取上传文件的大小

Iterator it_size=eRoot.getChildren("uploadFileSize").iterator();

if(it_size.hasNext()){

xmlFileSize=Integer.parseInt(((Element)it_size.next())

.getText());

if(xmlFileSize0){

intunit_count=0;

//为存储文件内容的字节数组分配存储空间

xmlFileBytes=newbyte[xmlFileSize];

//循环读取文件内容,并保存到字节数组中

Iterator it_content=eRoot.getChildren("uploadContent")

.iterator();

while(it_content.hasNext()){

//初始化Base64编码解码器

BASE64Decoder base64=newBASE64Decoder();

byte[]xmlNodeByteArray=base64

.decodeBuffer(((Element)it_content.next())

.getText());

if(xmlNodeByteArray.length=unit_size){

//读取一个完整数据单元的数据

System.arraycopy(xmlNodeByteArray,0,xmlFileBytes,

unit_count*unit_size,unit_size);

}else{

//读取小于一个数据单元的所有数据

System.arraycopy(xmlNodeByteArray,0,xmlFileBytes,

unit_count*unit_size,xmlFileSize

%unit_size);

}

//继续向下读取文件内容

unit_count++;

}

}

}

//保存路径

File path=newFile(xmlFilepath);

if(!path.exists()){

path.mkdirs();

}

//保存文件 word粘贴图片的名称

File file=newFile(path,xmlFilename);

//创建文件输入输出流

FileOutputStream fos=newFileOutputStream(file);

//写入文件内容

fos.write(xmlFileBytes);

fos.flush();

//关闭文件输入输出流

fos.close();

ReturnUploadImage rui=newReturnUploadImage();

rui.setTitle(xmlFilename);//这里需要设置文件名称如:xxx.jpg

rui.setOriginal(xmlFilename);//这里需要设置文件名称如:xxx.jpg

rui.setState("SUCCESS");

rui.setUrl(basePath+relativePath+xmlFilename);

JSONObject json=newJSONObject(rui);

String result=json.toString();//这边就是为了返回给UEditor做的格式转换

response.getWriter().write(result);

}catch(Exception e){

e.printStackTrace();

}

}

优化后的代码:

upload.jsp

%@pagelanguage="java"import="java.util.*"pageEncoding="utf-8"%

%@pagecontentType="text/html;charset=utf-8"%

%@pageimport="Xproer.*"%

%@pageimport="org.apache.commons.lang.StringUtils"%

%@pageimport="org.apache.commons.fileupload.*"%

%@pageimport="org.apache.commons.fileupload.disk.*"%

%@pageimport="org.apache.commons.fileupload.servlet.*"%

%out.clear();

/*

更新记录:

2013-01-25取消对SmartUpload的使用,改用commons-fileupload组件。因为测试发现SmartUpload有内存泄露的问题。

*/

//String path = request.getContextPath();

//String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";

String uname ="";// = request.getParameter("uid");

String upass ="";// = request.getParameter("fid");

// Check that we have a file upload request

booleanisMultipart = ServletFileUpload.isMultipartContent(request);

FileItemFactory factory =newDiskFileItemFactory();

ServletFileUpload upload =newServletFileUpload(factory);

//upload.setSizeMax(262144);//256KB

List files =null;

try

{

files = upload.parseRequest(request);

}

catch(FileUploadException e)

{//处理文件尺寸过大异常

out.println("上传文件异常:"+e.toString());

return;

}

FileItem imgFile =null;

//得到所有上传的文件

Iterator fileItr = files.iterator();

//循环处理所有文件

while(fileItr.hasNext())

{

//得到当前文件

imgFile = (FileItem) fileItr.next();

//忽略简单form字段而不是上传域的文件域(input type="text" /等)

if(imgFile.isFormField())

{

String fn = imgFile.getFieldName();

String fv = imgFile.getString();

if(fn.equals("uname")) uname = fv;

if(fn.equals("upass")) upass = fv;

}

else

{

break;

}

}

Uploader up =newUploader(pageContext,request);

up.SaveFile(imgFile);

String url = up.GetFilePathRel();

out.write(url);

response.setHeader("Content-Length",url.length()+"");//返回Content-length标记,以便控件正确读取返回地址。

%

剩下的后台功能和js参考下载文件中的UEditorAction 和 uploadForIE.js。

下面是我安装的依赖pom结构,可以根据自己的进行调整。

dependency

groupIdcom.baidu/groupId

artifactIdueditor/artifactId

version1.1.0/version

/dependency

基于springboot 和idea ,这里只提取了自动转存功能出来,功能还没测试,git代码没做公开,等后续测试好了再公开。

可以先使用csdn下载查看代码。

pom里引用了ueditor.jar

需要根据各自情况安装jar包

1.4.2中的jar包版本是1.1.0

mvn install:install-file -DgroupId=com.baidu -DartifactId=ueditor -Dversion=1.1.0 -Dpackaging=jar -Dfile=\ueditor\jsp\lib\ueditor-1.1.0.jar

运行

UeditorApplication的main方法

然后访问http://localhost:8088/ueditor/ 就可以测试了。

完成后的效果:

图片自动批量上传,不需要手动一张张选择图片上传,用户体验比百度ueditor自带的更好,传图效率更高。

?

上传成功后,图片地址自动替换成服务器地址

?

图片自动保存在服务器中

?

详细资料可以参考这篇文章:

Ueditor Word图片转存交互

讨论群:223813913

?

内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/79570.html

(0)

相关推荐

  • 金牛座和什么星座最配,与金牛座最配的星座是哪些

    技术金牛座和什么星座最配,与金牛座最配的星座是哪些金牛座 VS 牡羊座 配对评分金牛座和什么星座最配:70 还满不错的一对 星座比重:46:54 你们是很奇特的一对,白羊是急惊风,一想到就非要马上行动不可;金牛则是慢郎中

    生活 2021年10月26日
  • 居里温度,铁电材料的居里点是多少

    技术居里温度,铁电材料的居里点是多少铁的居里温度是770℃居里温度对于所有的磁性材料来说居里温度,并不是在任何温度下都具有磁性。一般地,磁性材料具有一个临界温度Tc,在这个温度以上,由于高温下原子的剧烈热运动,原子磁矩的

    生活 2021年10月28日
  • 租用美国服务器适合什么业务

    技术租用美国服务器适合什么业务从技术上讲,轻量级云服务器是特化了某一配置的高性价比云服务器的结合。下面,我们将了解轻量级云服务器有什么优势,使用物理服务器搭建网站,您需要租用整个服务器,这成本会变得非常昂贵。这对于一些比

    礼包 2021年12月21日
  • 如何理解MYSQL-GroupCommit 和 2pc提交

    技术如何理解MYSQL-GroupCommit 和 2pc提交这篇文章将为大家详细讲解有关如何理解MYSQL-GroupCommit 和 2pc提交,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后

    攻略 2021年11月16日
  • css如何加载外部字体文件

    技术css如何加载外部字体文件这篇文章主要介绍“css如何加载外部字体文件”,在日常操作中,相信很多人在css如何加载外部字体文件问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”css如何加

    攻略 2021年11月10日
  • come短语,come to什么意思

    技术come短语,come to什么意思come to意思是达到come短语;总计为;终于;结果是;苏醒(过来);把船朝着风头;停泊;继承(财产); (马, 牛群等)迅速向左转。My people come to wor

    生活 2021年10月20日