zoukankan      html  css  js  c++  java
  • struts2+ckeditor配置图片上传

    又是一个漫漫长夜。

    公司的编辑器坏了,用的是百度编辑器,上传图片的网址被框架给拦截了,我们本地怎么测试都没问题,放到服务器就这样了。和老李找了半天,疯了,没原因的。

    笔者以前用过jsp+ckeditor,觉得里面上传功能挺好用,于是想出这个法子,把网站的编辑器换掉。

    用的是最新的版本的,4点几的。很有wordpress的感觉,不知道是不是一家的。先预览一下:

    代码:

    package action;
    
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.io.PrintWriter;
    
    import javax.servlet.http.HttpServletResponse;
    
    import org.apache.struts2.ServletActionContext;
    
    import util.DateUtil;
    
    import com.opensymphony.xwork2.ActionSupport;
    
    public class UploadFile  extends ActionSupport{
            private File upload;  
            private String uploadContentType;  
            private String uploadFileName;  
          
          
            public File getUpload() {  
                return upload;  
            }  
          
            public void setUpload(File upload) {  
                  
                this.upload = upload;  
            }  
          
            public String getUploadContentType() {  
                return uploadContentType;  
            }  
          
            public void setUploadContentType(String uploadContentType) {  
                this.uploadContentType = uploadContentType;  
            }  
          
            public String getUploadFileName() {  
                return uploadFileName;  
            }  
          
            public void setUploadFileName(String uploadFileName) {  
                this.uploadFileName = uploadFileName;  
            }  
          
            public String execute() throws Exception {  
          
                HttpServletResponse response = ServletActionContext.getResponse();  
                response.setCharacterEncoding("GBK");  
                PrintWriter out = response.getWriter();  
          
                // CKEditor提交的很重要的一个参数  
                String callback = ServletActionContext.getRequest().getParameter("CKEditorFuncNum");   
                  
                String expandedName = "";  //文件扩展名  
                if (uploadContentType.equals("image/pjpeg") || uploadContentType.equals("image/jpeg")) {  
                    //IE6上传jpg图片的headimageContentType是image/pjpeg,而IE9以及火狐上传的jpg图片是image/jpeg  
                    expandedName = ".jpg";  
                }else if(uploadContentType.equals("image/png") || uploadContentType.equals("image/x-png")){  
                    //IE6上传的png图片的headimageContentType是"image/x-png"  
                    expandedName = ".png";  
                }else if(uploadContentType.equals("image/gif")){  
                    expandedName = ".gif";  
                }else if(uploadContentType.equals("image/bmp")){  
                    expandedName = ".bmp";  
                }else{  
                    out.println("<script type="text/javascript">");    
                    out.println("window.parent.CKEDITOR.tools.callFunction(" + callback + ",''," + "'文件格式不正确(必须为.jpg/.gif/.bmp/.png文件)');");   
                    out.println("</script>");  
                    return null;  
                }  
                  
                if(upload.length() > 600*1024){  
                    out.println("<script type="text/javascript">");    
                    out.println("window.parent.CKEDITOR.tools.callFunction(" + callback + ",''," + "'文件大小不得大于600k');");   
                    out.println("</script>");  
                    return null;  
                }  
                  
                  
                InputStream is = new FileInputStream(upload);  
                String uploadPath = ServletActionContext.getServletContext().getRealPath("img/upload/"+DateUtil.getDirDate());
                System.out.println("uploadpath:"+uploadPath);
                File dirfile=new File(uploadPath);
                if(!dirfile.exists()){
                         dirfile.mkdirs();
                      }
                
                String fileName = DateUtil.getDate();  //采用时间+UUID的方式随即命名  
                fileName += expandedName;  
                System.out.println("filename:"+fileName);
                File toFile = new File(uploadPath, fileName);  
                OutputStream os = new FileOutputStream(toFile);     
                byte[] buffer = new byte[1024];     
                int length = 0;  
                while ((length = is.read(buffer)) > 0) {     
                    os.write(buffer, 0, length);     
                }     
                is.close();  
                os.close();  
                  
                // 返回“图像”选项卡并显示图片  
                out.println("<script type="text/javascript">");    
                out.println("window.parent.CKEDITOR.tools.callFunction(" + callback + ",'" + "img/upload/"+ DateUtil.getDirDate() +"/"+ fileName + "','')");    
                out.println("</script>");  
                  
                return null;  
            }  
    }

    里面用到一个时间的工具类,用于按照时间创建目录和文件名字。文件名字精确到秒,以免发生名称重复。

    其中:

    out.println("window.parent.CKEDITOR.tools.callFunction(" + callback + ",'" + "img/upload/"+ DateUtil.getDirDate() +"/"+ fileName + "','')"); 

    这一句是上传图片后,返回给编辑器的一个图片路径地址。

    时间工具类:

    package com.util;
    
    import java.util.Calendar;
    
    public class DateUtil {
        public static String getDate(){
            Calendar calendar=Calendar.getInstance();
            int y=calendar.get(Calendar.YEAR);
            int m=calendar.get(Calendar.MONTH);
            int d=calendar.get(Calendar.DATE);
            int h=calendar.get(Calendar.HOUR);
            int mi=calendar.get(Calendar.MINUTE);
            int s=calendar.get(Calendar.SECOND);
            StringBuffer sb=new StringBuffer("");
            sb.append(y);
            sb.append(m+1);
            sb.append(d);
            sb.append(h);
            sb.append(mi);
            sb.append(s);
            String date=sb.toString();
            return date;
        }
        
        public static String getDirDate(){
            Calendar calendar=Calendar.getInstance();
            int y=calendar.get(Calendar.YEAR);
            int m=calendar.get(Calendar.MONTH);
            int d=calendar.get(Calendar.DATE);
            StringBuffer sb=new StringBuffer("");
            sb.append(y);
            sb.append(m+1);
            sb.append(d);
            String date=sb.toString();
            return date;
        }
        
    }

    其中很有意思的是,上面获取的月份,比当前月份要少一个月,不知道这个是怎么理解(有人说老外是从0开始计算月份的,呵呵),于是加1代表当前月份。

    然后在struts.xml中,配置一个action即可,不需要result,返回为null的。

     <action name="uploadfile" class="indexAction" method="uploadfile">
            </action>

    哦,既然有action,当然要有请求他的。这个请求是点击上传时候发生的,在config.js配置:

        //个人的配置
        config.filebrowserUploadUrl="/uploadfile.html";

    在结束前插入这一句。我这里后面是html,是因为url重写的。默认情况就是上面的action name。

    然后就是在各个页面引入编辑器框架。

         <!-- 插入ckeditor  -->
        <textarea rows="70" cols="80" name="content"></textarea>

    还要引入以下这个js:

     <script type="text/javascript">CKEDITOR.replace('content');</script>
    <script type="text/javascript">
        window.onload = function()
        {
            CKEDITOR.replace( 'content' );
        };
    </script>


    最后是在页面头部引入框架的js:

    <script type="text/javascript" src="${webroot}/plugins/ckeditor/ckeditor.js"></script>

    顺序貌似说反了,大概就是这样。这个真心比百度编辑器好用,整合也简单方便。

  • 相关阅读:
    hdu 6182A Math Problem(快速幂)
    861. 二分图的最大匹配(匈牙利算法模板)
    860. 染色法判定二分图(模板)
    859. Kruskal算法求最小生成树(模板)
    858. Prim算法求最小生成树(模板)
    洛谷 P2577 [ZJOI2005]午餐
    洛谷 P2286 [HNOI2004]宠物收养场
    【模板】Splay
    P2234 [HNOI2002]营业额统计
    洛谷 P3369 【模板】普通平衡树
  • 原文地址:https://www.cnblogs.com/juepei/p/3805255.html
Copyright © 2011-2022 走看看