精华内容
下载资源
问答
  • ![图片说明](https://img-ask.csdn.net/upload/201804/19/1524115200_394564.png)!...!... 桌面的txt都可以修改内容保存在桌面,但是这个word文档和excel修改内容保存就不行 ...大神说下为什么?怎么解决啊 谢谢!!!
  • 用高版本(07及以上版本)Office保存时默认保存为.docx 格式,.doc(WORD97-2003文档)是03及以下版本的保存格式,07及以上版本可以打开.doc 格式,但是显示兼容模式,03版本Word默认情况无法打开.docx 格式,需要...

    用高版本(07及以上版本)Office保存时默认保存为.docx 格式,.doc(WORD97-2003文档)是03及以下版本的保存格式,07及以上版本可以打开.doc 格式,但是显示为兼容模式,03版本Word默认情况无法打开.docx 格式,需要使用03版本Word编辑.docx 格式需要安装07版本兼容包。


    展开全文
  • 1.4.2之后官方并没有做功能的改动,1.4.2在word复制这块没有bug,其他版本会出现手动无法转存的情况 本文使用的后台是Java。前端Jsp(前端都一样,后台如果语言不通得自己做 Base64编码解码) 因为公司业务需要...

    1.4.2之后官方并没有做功能的改动,1.4.2在word复制这块没有bug,其他版本会出现手动无法转存的情况

    本文使用的后台是Java。前端为Jsp(前端都一样,后台如果语言不通得自己做 Base64编码解码)

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

    例如www.wangEditor.com  但试了一圈都不支持IE8 。

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

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

    改动过后的插件只适合IE8。

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

     

    1.IE设置

    在受信任站点里添加信任网站。

    这里本机测试使用的直接是   http://localhost

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

    ActiveXObject设置可以去网上参考,这里不列举了。

    前面的

    到这里 IE 的准备工作完成了。

    修改ueditor.all.js关键代码

    14006行附近,如果是其他版本的ueditor,在功能正常的情况下,可以拷贝下面代码。

    var imgPath = attrs.src;

    var imgUrl = attrs.src;

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

        if (navigator.userAgent.match(/Trident/i) && navigator.userAgent.match(/MSIE 8.0/i)) { //判断浏览器内核是否为Trident内核IE8.0

            var realPath = imgPath.substring(8, imgPath.length);

            var filename = imgPath.substring(imgPath.lastIndexOf('/') + 1, imgPath.length);

            var result = UploadForIE.saveAttachment(filename, realPath);

            if (result) {

                var json = eval('(' + result + ')');

                imgUrl = json.url;

            }

        }

    }

    img.setAttr({

     

        width: attrs.width,

        height: attrs.height,

        alt: attrs.alt,

        word_img: attrs.src,

        src: imgUrl,

        'style': 'background:url(' + (flag ? opt.themePath + opt.theme + '/images/word.gif': opt.langPath + opt.lang + '/images/localimage.png') + ') no-repeat center center;border:1px solid #ddd'

    })

     

    uploadForIE.js。

    var UploadForIE = {

        // 保存到xml附件,并且通过ajax 上传

        saveAttachment: function(upload_filename, localFilePath) {

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

            var upload_target_url = "uploadImg";

            var strTempFile = localFilePath;

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

            var xml_dom = UploadForIE.createDocument();

            xml_dom.loadXML('<?xml version="1.0" encoding="GBK" ?> <root/>');

            // 创建ADODB.Stream对象

            var ado_stream = new ActiveXObject("adodb.stream");

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

            ado_stream.Type = 1; // adTypeBinary

            // 打开ADODB.Stream对象

            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; i < read_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.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject("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;

            return result;

        },

     

        // 创建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; i < len; i++) {

                try {

                    xmldom = new ActiveXObject(versions[i]);

                    if (xmldom != null) break;

                } catch(ex) {

                    //跳过

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

                }

            }

            return xmldom;

        }

    }

     

    UEditorAction保存图片方法

    @RequestMapping("/uploadImg")

        public void uploadADO(HttpServletRequest request, HttpServletResponse response) {

            String path1 = request.getContextPath();

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

     

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

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

            int unit_size = 1024;

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

            int xmlFileSize = 0;

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

            String xmlFilename = "";

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

            String xmlFilepath = "";

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

            byte[] xmlFileBytes = null;

            try {

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

                SAXBuilder builder = new SAXBuilder();

                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 (xmlFileSize > 0) {

                        int unit_count = 0;

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

                        xmlFileBytes = new byte[xmlFileSize];

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

                        Iterator it_content = eRoot.getChildren("uploadContent")

                                .iterator();

                        while (it_content.hasNext()) {

                            // 初始化Base64编码解码器

                            BASE64Decoder base64 = new BASE64Decoder();

                            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 = new File(xmlFilepath);

                if(!path.exists()){

                    path.mkdirs();

                }

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

                File file = new File(path,xmlFilename);

                // 创建文件输入输出流

                FileOutputStream fos = new FileOutputStream(file);

                // 写入文件内容

                fos.write(xmlFileBytes);

                fos.flush();

                // 关闭文件输入输出流

                fos.close();

     

                ReturnUploadImage rui = new ReturnUploadImage();

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

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

                rui.setState("SUCCESS");

                rui.setUrl(basePath +relativePath+xmlFilename);

     

                JSONObject json = new JSONObject(rui);

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

                response.getWriter().write(result);

            } catch (Exception e) {

                e.printStackTrace();

            }

        }

    优化后的代码:

    upload.jsp

    <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>

    <%@ page contentType="text/html;charset=utf-8"%>

    <%@ page import = "Xproer.*" %>

    <%@ page import="org.apache.commons.lang.StringUtils" %>

    <%@ page import="org.apache.commons.fileupload.*" %>

    <%@ page import="org.apache.commons.fileupload.disk.*" %>

    <%@ page import="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

    boolean isMultipart = ServletFileUpload.isMultipartContent(request);

    FileItemFactory factory = new DiskFileItemFactory();  

    ServletFileUpload upload = new ServletFileUpload(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 = new Uploader(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>

                <groupId>com.baidu</groupId>

                <artifactId>ueditor</artifactId>

                <version>1.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自带的更好,传图效率更高。

     

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

     

    图片自动保存在服务器中

     

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

    http://blog.ncmem.com/wordpress/2019/08/12/ueditor-word%E5%9B%BE%E7%89%87%E8%BD%AC%E5%AD%98%E4%BA%A4%E4%BA%92/

     

    讨论群:223813913

    展开全文
  • 1.4.2之后官方并没有做功能的改动,1.4.2在word复制这块没有bug,其他版本会出现手动无法转存的情况 本文使用的后台是Java。前端Jsp(前端都一样,后台如果语言不通得自己做 Base64编码解码) 因为公司业务需要...

    1.4.2之后官方并没有做功能的改动,1.4.2在word复制这块没有bug,其他版本会出现手动无法转存的情况

    本文使用的后台是Java。前端为Jsp(前端都一样,后台如果语言不通得自己做 Base64编码解码)

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

    例如www.wangEditor.com  但试了一圈都不支持IE8 。

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

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

    改动过后的插件只适合IE8。

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

     

    1.IE设置

    在受信任站点里添加信任网站。

    这里本机测试使用的直接是   http://localhost

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

    ActiveXObject设置可以去网上参考,这里不列举了。

    前面的

    到这里 IE 的准备工作完成了。

    修改ueditor.all.js关键代码

    14006行附近,如果是其他版本的ueditor,在功能正常的情况下,可以拷贝下面代码。

    var imgPath = attrs.src;

    var imgUrl = attrs.src;

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

        if (navigator.userAgent.match(/Trident/i) && navigator.userAgent.match(/MSIE 8.0/i)) { //判断浏览器内核是否为Trident内核IE8.0

            var realPath = imgPath.substring(8, imgPath.length);

            var filename = imgPath.substring(imgPath.lastIndexOf('/') + 1, imgPath.length);

            var result = UploadForIE.saveAttachment(filename, realPath);

            if (result) {

                var json = eval('(' + result + ')');

                imgUrl = json.url;

            }

        }

    }

    img.setAttr({

     

        width: attrs.width,

        height: attrs.height,

        alt: attrs.alt,

        word_img: attrs.src,

        src: imgUrl,

        'style': 'background:url(' + (flag ? opt.themePath + opt.theme + '/images/word.gif': opt.langPath + opt.lang + '/images/localimage.png') + ') no-repeat center center;border:1px solid #ddd'

    })

     

    uploadForIE.js。

    var UploadForIE = {

        // 保存到xml附件,并且通过ajax 上传

        saveAttachment: function(upload_filename, localFilePath) {

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

            var upload_target_url = "uploadImg";

            var strTempFile = localFilePath;

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

            var xml_dom = UploadForIE.createDocument();

            xml_dom.loadXML('<?xml version="1.0" encoding="GBK" ?> <root/>');

            // 创建ADODB.Stream对象

            var ado_stream = new ActiveXObject("adodb.stream");

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

            ado_stream.Type = 1; // adTypeBinary

            // 打开ADODB.Stream对象

            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; i < read_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.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject("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;

            return result;

        },

     

        // 创建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; i < len; i++) {

                try {

                    xmldom = new ActiveXObject(versions[i]);

                    if (xmldom != null) break;

                } catch(ex) {

                    //跳过

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

                }

            }

            return xmldom;

        }

    }

     

    UEditorAction保存图片方法

    @RequestMapping("/uploadImg")

        public void uploadADO(HttpServletRequest request, HttpServletResponse response) {

            String path1 = request.getContextPath();

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

     

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

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

            int unit_size = 1024;

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

            int xmlFileSize = 0;

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

            String xmlFilename = "";

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

            String xmlFilepath = "";

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

            byte[] xmlFileBytes = null;

            try {

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

                SAXBuilder builder = new SAXBuilder();

                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 (xmlFileSize > 0) {

                        int unit_count = 0;

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

                        xmlFileBytes = new byte[xmlFileSize];

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

                        Iterator it_content = eRoot.getChildren("uploadContent")

                                .iterator();

                        while (it_content.hasNext()) {

                            // 初始化Base64编码解码器

                            BASE64Decoder base64 = new BASE64Decoder();

                            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 = new File(xmlFilepath);

                if(!path.exists()){

                    path.mkdirs();

                }

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

                File file = new File(path,xmlFilename);

                // 创建文件输入输出流

                FileOutputStream fos = new FileOutputStream(file);

                // 写入文件内容

                fos.write(xmlFileBytes);

                fos.flush();

                // 关闭文件输入输出流

                fos.close();

     

                ReturnUploadImage rui = new ReturnUploadImage();

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

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

                rui.setState("SUCCESS");

                rui.setUrl(basePath +relativePath+xmlFilename);

     

                JSONObject json = new JSONObject(rui);

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

                response.getWriter().write(result);

            } catch (Exception e) {

                e.printStackTrace();

            }

        }

    优化后的代码:

    upload.jsp

    <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>

    <%@ page contentType="text/html;charset=utf-8"%>

    <%@ page import = "Xproer.*" %>

    <%@ page import="org.apache.commons.lang.StringUtils" %>

    <%@ page import="org.apache.commons.fileupload.*" %>

    <%@ page import="org.apache.commons.fileupload.disk.*" %>

    <%@ page import="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

    boolean isMultipart = ServletFileUpload.isMultipartContent(request);

    FileItemFactory factory = new DiskFileItemFactory();  

    ServletFileUpload upload = new ServletFileUpload(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 = new Uploader(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>

                <groupId>com.baidu</groupId>

                <artifactId>ueditor</artifactId>

                <version>1.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自带的更好,传图效率更高。

     

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

     

    图片自动保存在服务器中

     

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

    http://blog.ncmem.com/wordpress/2019/08/12/ueditor-word%E5%9B%BE%E7%89%87%E8%BD%AC%E5%AD%98%E4%BA%A4%E4%BA%92/

     

    讨论群:223813913

    展开全文
  • 1.4.2之后官方并没有做功能的改动,1.4.2在word复制这块没有bug,其他版本会出现手动无法转存的情况 本文使用的后台是Java。前端Jsp(前端都一样,后台如果语言不通得自己做 Base64编码解码) 因为公司业务需要...

    1.4.2之后官方并没有做功能的改动,1.4.2在word复制这块没有bug,其他版本会出现手动无法转存的情况

    本文使用的后台是Java。前端为Jsp(前端都一样,后台如果语言不通得自己做 Base64编码解码)

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

    例如www.wangEditor.com  但试了一圈都不支持IE8 。

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

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

    改动过后的插件只适合IE8。

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

     

    1.IE设置

    在受信任站点里添加信任网站。

    这里本机测试使用的直接是   http://localhost

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

    ActiveXObject设置可以去网上参考,这里不列举了。

    前面的

    到这里 IE 的准备工作完成了。

    修改ueditor.all.js关键代码

    14006行附近,如果是其他版本的ueditor,在功能正常的情况下,可以拷贝下面代码。

    var imgPath = attrs.src;

    var imgUrl = attrs.src;

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

        if (navigator.userAgent.match(/Trident/i) && navigator.userAgent.match(/MSIE 8.0/i)) { //判断浏览器内核是否为Trident内核IE8.0

            var realPath = imgPath.substring(8, imgPath.length);

            var filename = imgPath.substring(imgPath.lastIndexOf('/') + 1, imgPath.length);

            var result = UploadForIE.saveAttachment(filename, realPath);

            if (result) {

                var json = eval('(' + result + ')');

                imgUrl = json.url;

            }

        }

    }

    img.setAttr({

     

        width: attrs.width,

        height: attrs.height,

        alt: attrs.alt,

        word_img: attrs.src,

        src: imgUrl,

        'style': 'background:url(' + (flag ? opt.themePath + opt.theme + '/images/word.gif': opt.langPath + opt.lang + '/images/localimage.png') + ') no-repeat center center;border:1px solid #ddd'

    })

     

    uploadForIE.js。

    var UploadForIE = {

        // 保存到xml附件,并且通过ajax 上传

        saveAttachment: function(upload_filename, localFilePath) {

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

            var upload_target_url = "uploadImg";

            var strTempFile = localFilePath;

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

            var xml_dom = UploadForIE.createDocument();

            xml_dom.loadXML('<?xml version="1.0" encoding="GBK" ?> <root/>');

            // 创建ADODB.Stream对象

            var ado_stream = new ActiveXObject("adodb.stream");

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

            ado_stream.Type = 1; // adTypeBinary

            // 打开ADODB.Stream对象

            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; i < read_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.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject("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;

            return result;

        },

     

        // 创建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; i < len; i++) {

                try {

                    xmldom = new ActiveXObject(versions[i]);

                    if (xmldom != null) break;

                } catch(ex) {

                    //跳过

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

                }

            }

            return xmldom;

        }

    }

     

    UEditorAction保存图片方法

    @RequestMapping("/uploadImg")

        public void uploadADO(HttpServletRequest request, HttpServletResponse response) {

            String path1 = request.getContextPath();

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

     

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

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

            int unit_size = 1024;

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

            int xmlFileSize = 0;

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

            String xmlFilename = "";

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

            String xmlFilepath = "";

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

            byte[] xmlFileBytes = null;

            try {

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

                SAXBuilder builder = new SAXBuilder();

                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 (xmlFileSize > 0) {

                        int unit_count = 0;

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

                        xmlFileBytes = new byte[xmlFileSize];

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

                        Iterator it_content = eRoot.getChildren("uploadContent")

                                .iterator();

                        while (it_content.hasNext()) {

                            // 初始化Base64编码解码器

                            BASE64Decoder base64 = new BASE64Decoder();

                            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 = new File(xmlFilepath);

                if(!path.exists()){

                    path.mkdirs();

                }

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

                File file = new File(path,xmlFilename);

                // 创建文件输入输出流

                FileOutputStream fos = new FileOutputStream(file);

                // 写入文件内容

                fos.write(xmlFileBytes);

                fos.flush();

                // 关闭文件输入输出流

                fos.close();

     

                ReturnUploadImage rui = new ReturnUploadImage();

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

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

                rui.setState("SUCCESS");

                rui.setUrl(basePath +relativePath+xmlFilename);

     

                JSONObject json = new JSONObject(rui);

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

                response.getWriter().write(result);

            } catch (Exception e) {

                e.printStackTrace();

            }

        }

    优化后的代码:

    upload.jsp

    <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>

    <%@ page contentType="text/html;charset=utf-8"%>

    <%@ page import = "Xproer.*" %>

    <%@ page import="org.apache.commons.lang.StringUtils" %>

    <%@ page import="org.apache.commons.fileupload.*" %>

    <%@ page import="org.apache.commons.fileupload.disk.*" %>

    <%@ page import="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

    boolean isMultipart = ServletFileUpload.isMultipartContent(request);

    FileItemFactory factory = new DiskFileItemFactory();  

    ServletFileUpload upload = new ServletFileUpload(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 = new Uploader(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>

                <groupId>com.baidu</groupId>

                <artifactId>ueditor</artifactId>

                <version>1.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自带的更好,传图效率更高。

     

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

     

    图片自动保存在服务器中

     

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

    http://blog.ncmem.com/wordpress/2019/08/12/ueditor-word%E5%9B%BE%E7%89%87%E8%BD%AC%E5%AD%98%E4%BA%A4%E4%BA%92/

     

    讨论群:223813913

    展开全文
  • 很多代码编辑工具都支持语法高亮,如果能在word里面高亮将会很漂亮。...1、首先将代码文件保存为utf-8;以防止有中文注释 2、用notepad++打开代码(如果在notepad++中无法高亮,则在word里面也不能高亮) 这
  • 因为讲课的需要,经常要做各种各样的... 后来发现,估计是服务器端IE之类的有什么诡异安全性限制,如果想要在线打开、创建、编辑、保存文档库中的文档的话,需要在客户端里进行如下设置(以Word为例,其实都一样的...
  • oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 第一章 Oracle入门 一、 数据库概述 数据库(Database)是按照数据结构来组织、存储和管理数据的仓库,它产生于距今五十年前。简单来说是本身可视...
  • 为什么不适用word文档插件,其实作者也使用过不过出现了一些作者无法解决的问题,比如word文档转换html或者html转换word后会出现格式不对的现象,这使得作者很困扰。再者我们需要在网页端书写漂亮的文档,并且把数据...
  • WPS word转换PDF为什么是乱码PDF转Word的过程中产生乱码的原因主要是:1、文字编码不兼容。2、文字保存时使用了内嵌的字体。3、PDF文档制作时没有严格按照PDF标准,反向转换时,也无法顺利反编译。对于这些情况,...
  • 现在我们在网上搜索资料,大部分都是只能查看,想要下载需要收费,直接复制也被限制,那么有什么方法可以把这样的网页资料直接识别成文字到Word文档中呢? 方法1:查看源代码 在需要复制的页面处右击,选择“查看源...
  • 本步骤将编译 u-boot.bin文件,但此时还无法运行在FS2410开发板上。 二、修改 cpu/arm920t/start.S文件,完成 U-Boot的重定向 (1)修改中断禁止部分 # if defined(CONFIG_S3C2410) ldr r1, =0x7ff /*根据 2410...
  • java读取word文档时,虽然网上介绍了很多插件poi、java2Word、jacob、itext等等,poi无法读取格式(新的API估计行好像还在处于研发阶段,不太稳定,做项目不太敢用);java2Word、jacob容易报错找不到注册,比较诡异,...
  • 学英语之前,要想清楚为什么要学英语,然后再想如何学好英语。 如果学会了大量的英语单词但是不会用这些单词,你学的英语是否有用,如果学会了英语但是你不会说你学的英语是否有用?我们中国的教育方式都注重于学,...
  • 我是一个“线程”

    2018-05-16 09:39:23
    1)以你常用的Word为例,假设这个进程没有多线程(或者说它只有一个线程), 如果它有个定时保存文档的功能,你想象下,当这个自动保存的功能在运行的时候,就不能继续输入文字了。 2)单线程只能干一件事情,无法...
  • 为什么要使用专业的个人知识管理软件? 读书才能改变人的一生。 现在是持续的学习,才能赶上变化, 才能早点悟透所在领域的发展趋势。 而持续的学习,现在最好的方式是利用好互联网,利用好电脑进行电子化...
  • 为什么要使用专业的个人知识管理软件? 读书才能改变人的一生。 现在是持续的学习,才能赶上变化, 才能早点悟透所在领域的发展趋势。 而持续的学习,现在最好的方式是利用好互联网,利用好电脑进行电子化...
  • 为什么要使用专业的个人知识管理软件? 读书才能改变人的一生。 现在是持续的学习,才能赶上变化, 才能早点悟透所在领域的发展趋势。 而持续的学习,现在最好的方式是利用好互联网,利用好电脑进行电子化...
  • 当初是什么吸引了我,并使我至今仍之兴奋?是Axure的功能。我不需要程序员,也不需要花费数月来学习一门编程语言。拥有了Axure,就能让我自由地进行迭代设计和测试,还可以塑造完美的可点击的交互原型。Axure简单...
  • 339.无法为USB接口安装驱动程序 340.机箱前置USB UI不能使用 341.计算机不能正常关机 342.电源风扇只是抖动 343.电压不稳造成计算机重启 344.电源质量差导致计算机故障 345.电源故障导致开机不正常 346.电源引起...
  • 15. 为什么嵌入式操作系统通常采用微内核结构? 答:嵌入式操作系统与一般操作系统相比具有比较明显的差别 : (1)嵌入式操作系统规模一般较小,因为一般硬件配置较低,而且对操作系统提供的功能要求也不高。(2)应用...
  • Perfect文档、Microsoft:Word文档;DisplayWrite文档 DOT:Microsoft Word文档模板 DPL:Borland Delph 3压缩库 DRV:驱动程序 DRW:Micrografx Designer/Draw;Pro/E绘画文件 DSF:Micrografx Designer VFX...
  • html入门到放弃笔记

    2018-05-15 15:06:12
    W3C :Word Wide Web Consortium (万维网联盟) 1、HTML文档的组成 1、文档类型声明 告知浏览器当前的HTML文档用的是哪个版本 在网页的最顶端 <!doctype html> 2、由一对 html 根标记,来表示页面的开始与结束...
  • SECURITY OPTION(检测密码方式)如设定SETUP,则每次打开机器时屏幕均会提示输入口令(普通用户口令或超级用户口令,普通用户无权修改BIOS设置),不知道口令则无法使用机器;如设定SYSTEM则只有在用户想进入BIOS设置...
  • 谈谈感想吧,别听什么培训机构诳你什么爬虫工程师有前途啥的,当然学好学精爬虫也能拿到高薪,但这一行也有不少人了,精通的自然不用说。而且现在有很多像八爪鱼、火车头这些可以定制的爬虫软件,还有一些自学习的...
  • 阅读工具 开卷有益

    2012-03-31 14:07:03
    增加: 启动后是否显示最后阅读文档选项. 系统设置|常规设置|进入后显示上次阅读内容 5. 增加:4种图片缩放模式:页面适应、宽度适应(锁定X轴)、高度适应(锁定Y轴)、原始大小 6. 增加:3种图片对齐模式:左上角...
  • asp.net知识库

    2015-06-18 08:45:45
    C# 2.0会给我们带来什么 泛型技巧系列:如何提供类型参数之间的转换 C#2.0 - Object Pool 简单实现 Attributes in C# 手痒痒,也来个c# 2.0 object pool 泛型技巧系列:用泛型打造可复用的抽象工厂 体验.net2.0的优雅...
  • 5.动态鼠标精灵:你的鼠标为什么会跳舞、表演魔术? 6.精美文件图标:专门为您搜集整理了一些精美绝伦的小图标,供您装修系统图标时使用。 7.电子摄像头:启动监控以后,监控我的办公室,具有定时拍摄功能。 (八...
  • 会计理论考试题

    2012-03-07 21:04:40
    C、每一类都不以另一类基础 D、后者以前者基础 20.计算机辅助设计软件主要用于___B___。 A、文字处理 B、制图和设计 C、实时控制 D、科学计算 21.计算机操作系统的作用是 __D___ 。 A、控制计算机的硬件设备 B、...
  • 算学费输入数据求最大精确划分思维解决最大次大交换数据实现按行显示围棋棋盘绘制国际象棋绘制为什么要用函数函数的四种类型函数的一般形式必须用函数的理由-哥德巴赫函数的本质就是地址函数变量意义函数变量用途...

空空如也

空空如也

1 2
收藏数 33
精华内容 13
关键字:

为什么word文档无法保存