博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[ckeditor系列]CKEDITOR 通过SERVLET 打开上传功能
阅读量:5352 次
发布时间:2019-06-15

本文共 10920 字,大约阅读时间需要 36 分钟。

在CKEditor中把上传配置给打开,很简单,脚本段改为如下设置:

 这里参数我们可以自己设置,加个Type为了区分文件类型,因为都使用同一个Servlet处理。事情没有这么简单,CKEditor毕竟是个复杂的组件,我们这么配置,看看它给我们还原成什么了吧,在FireFox中使用FireBug查看,看到了这些: 

 
    看到了吧,在Type后面它为我们又挂接了几个参数,其中我们需要的是CKEditorFuncNum和file域的name值 upload,CKEditorFuncNum这个参数是用来回调页面的,就是上传成功后,页面自动切换到“图像”选项卡。upload参数是 servlet获取上传文件用的参数名。其余参数就根据需要进行了。 
    这些参数的名称都是查看源码获得的,不能想当然。有了这些东西后面就好办了,就是文件上传了么。很简单了。这里我们使用apache commons组件中的fileupload和io。 
先看web.xml,我们做些设置。

SimpleUploader
ckeditor.CKEditorUploadServlet
baseDir
/UserFiles/
debug
false
enabled
true
AllowedExtensionsFile
DeniedExtensionsFile
html|htm|php|php2|php3|php4|php5|phtml|pwml|inc|asp|aspx|ascx|jsp|cfm|cfc|pl|bat|exe|com|dll|vbs|js|reg|cgi|htaccess|asis|ftl
AllowedExtensionsImage
jpg|gif|jpeg|png|bmp
DeniedExtensionsImage
AllowedExtensionsFlash
swf|fla
DeniedExtensionsFlash
0
SimpleUploader
/ckeditor/uploader
index.html

主要是Servlet的初始化参数,规定了文件上传的扩展名规则,就是允许上传的类型和阻止上传的类型。分为File,Image和FLASH三种,这个上传参数的设置是对应的。Debug是设置servlet知否进行debug,默认是关闭的。enabled是设置该servlet是否有效,如果禁止上传,就打成false。还有一个baseDir是设定CKEditor上传文件的存放位置。 

    下面就是实现类了,比较长,但是有详细的注释:

package ckeditor;import java.io.*;import java.text.SimpleDateFormat;import java.util.*;import javax.servlet.ServletException;import javax.servlet.http.*;import org.apache.commons.fileupload.FileItem;import org.apache.commons.fileupload.FileItemFactory;import org.apache.commons.fileupload.disk.DiskFileItemFactory;import org.apache.commons.fileupload.servlet.ServletFileUpload;public class CKEditorUploadServlet extends HttpServlet {    private static String baseDir;// CKEditor的根目录    private static boolean debug = false;// 是否debug模式    private static boolean enabled = false;// 是否开启CKEditor上传    private static Hashtable allowedExtensions;// 允许的上传文件扩展名    private static Hashtable deniedExtensions;// 阻止的上传文件扩展名    private static SimpleDateFormat dirFormatter;// 目录命名格式:yyyyMM    private static SimpleDateFormat fileFormatter;// 文件命名格式:yyyyMMddHHmmssSSS    /**     * Servlet初始化方法     */    public void init() throws ServletException {        // 从web.xml中读取debug模式        debug = (new Boolean(getInitParameter("debug"))).booleanValue();        if (debug)            System.out                    .println("\r\n---- SimpleUploaderServlet initialization started ----");        // 格式化目录和文件命名方式        dirFormatter = new SimpleDateFormat("yyyyMM");        fileFormatter = new SimpleDateFormat("yyyyMMddHHmmssSSS");        // 从web.xml中获取根目录名称        baseDir = getInitParameter("baseDir");        // 从web.xml中获取是否可以进行文件上传        enabled = (new Boolean(getInitParameter("enabled"))).booleanValue();        if (baseDir == null)            baseDir = "/UserFiles/";        String realBaseDir = getServletContext().getRealPath(baseDir);        File baseFile = new File(realBaseDir);        if (!baseFile.exists()) {            baseFile.mkdirs();        }        // 实例化允许的扩展名和阻止的扩展名        allowedExtensions = new Hashtable(3);        deniedExtensions = new Hashtable(3);        // 从web.xml中读取配置信息        allowedExtensions.put("File",        stringToArrayList(getInitParameter("AllowedExtensionsFile")));        deniedExtensions.put("File",        stringToArrayList(getInitParameter("DeniedExtensionsFile")));        allowedExtensions.put("Image",    stringToArrayList(getInitParameter("AllowedExtensionsImage")));        deniedExtensions.put("Image",            stringToArrayList(getInitParameter("DeniedExtensionsImage")));        allowedExtensions.put("Flash",            stringToArrayList(getInitParameter("AllowedExtensionsFlash")));        deniedExtensions.put("Flash",            stringToArrayList(getInitParameter("DeniedExtensionsFlash")));        if (debug)            System.out                    .println("---- SimpleUploaderServlet initialization completed ----\r\n");    }    public void doGet(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {        doPost(request, response);    }    public void doPost(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {        if (debug)            System.out.println("--- BEGIN DOPOST ---");        response.setContentType("text/html; charset=UTF-8");        response.setHeader("Cache-Control", "no-cache");        PrintWriter out = response.getWriter();        // 从请求参数中获取上传文件的类型:File/Image/Flash        String typeStr = request.getParameter("Type");        if (typeStr == null) {            typeStr = "File";        }        if (debug)            System.out.println(typeStr);        // 实例化dNow对象,获取当前时间        Date dNow = new Date();        // 设定上传文件路径        String currentPath = baseDir + typeStr + "/"                + dirFormatter.format(dNow);        // 获得web应用的上传路径        String currentDirPath = getServletContext().getRealPath(currentPath);        // 判断文件夹是否存在,不存在则创建        File dirTest = new File(currentDirPath);        if (!dirTest.exists()) {            dirTest.mkdirs();        }        // 将路径前加上web应用名        currentPath = request.getContextPath() + currentPath;        if (debug)            System.out.println(currentDirPath);        // 文件名和文件真实路径        String newName = "";        String fileUrl = "";        if (enabled) {            // 使用Apache Common组件中的fileupload进行文件上传            FileItemFactory factory = new DiskFileItemFactory();            ServletFileUpload upload = new ServletFileUpload(factory);            try {                List items = upload.parseRequest(request);                Map fields = new HashMap();                Iterator iter = items.iterator();                while (iter.hasNext()) {                    FileItem item = (FileItem) iter.next();                    if (item.isFormField())                        fields.put(item.getFieldName(), item.getString());                    else                        fields.put(item.getFieldName(), item);                }                // CEKditor中file域的name值是upload                FileItem uplFile = (FileItem) fields.get("upload");                // 获取文件名并做处理                String fileNameLong = uplFile.getName();                fileNameLong = fileNameLong.replace('\\', '/');                String[] pathParts = fileNameLong.split("/");                String fileName = pathParts[pathParts.length - 1];                // 获取文件扩展名                String ext = getExtension(fileName);                // 设置上传文件名                fileName = fileFormatter.format(dNow) + "." + ext;                // 获取文件名(无扩展名)                String nameWithoutExt = getNameWithoutExtension(fileName);                File pathToSave = new File(currentDirPath, fileName);                fileUrl = currentPath + "/" + fileName;                if (extIsAllowed(typeStr, ext)) {                    int counter = 1;                    while (pathToSave.exists()) {                        newName = nameWithoutExt + "_" + counter + "." + ext;                        fileUrl = currentPath + "/" + newName;                        pathToSave = new File(currentDirPath, newName);                        counter++;                    }                    uplFile.write(pathToSave);                } else {                    if (debug)                        System.out.println("无效的文件类型: " + ext);                }            } catch (Exception ex) {                if (debug)                    ex.printStackTrace();            }        } else {            if (debug)                System.out.println("未开启CKEditor上传功能");        }        // CKEditorFuncNum是回调时显示的位置,这个参数必须有        String callback = request.getParameter("CKEditorFuncNum");        out.println("");        out.flush();        out.close();        if (debug)            System.out.println("--- END DOPOST ---");    }    /**     * 获取文件名的方法     */    private static String getNameWithoutExtension(String fileName) {        return fileName.substring(0, fileName.lastIndexOf("."));    }    /**     * 获取扩展名的方法     */    private String getExtension(String fileName) {        return fileName.substring(fileName.lastIndexOf(".") + 1);    }    /**     * 字符串像ArrayList转化的方法     */    private ArrayList stringToArrayList(String str) {        if (debug)            System.out.println(str);        String[] strArr = str.split("\\|");        ArrayList tmp = new ArrayList();        if (str.length() > 0) {            for (int i = 0; i < strArr.length; ++i) {                if (debug)                    System.out.println(i + " - " + strArr[i]);                tmp.add(strArr[i].toLowerCase());            }        }        return tmp;    }    /**     * 判断扩展名是否允许的方法     */    private boolean extIsAllowed(String fileType, String ext) {        ext = ext.toLowerCase();        ArrayList allowList = (ArrayList) allowedExtensions.get(fileType);        ArrayList denyList = (ArrayList) deniedExtensions.get(fileType);        if (allowList.size() == 0) {            if (denyList.contains(ext)) {                return false;            } else {                return true;            }        }        if (denyList.size() == 0) {            if (allowList.contains(ext)) {                return true;            } else {                return false;            }        }        return false;    }}

 只要在页面中的script中设置了上传属性,我们打开图片时就能看到上传选项卡了,选择图片后,点击上传到服务器,上传成功就会自动跳到图像选项卡,可以看到源文件已经存在服务器的目标目录中了,此时,我们就可以在编辑器中编辑上传的图片了,非常方便。 

 
    下面我们进行图片上传测试,可以看到如下效果。 
 
    提交后可以看到,数据获得效果,是完全一致的,这样使用CKEditor上传文件就已经成功了。 
 
    我们查看源文件,得到如下结果。

Display Content
主题: 图片上传测试
内容:

图片上传测试

原文地址:http://www.cnblogs.com/hannover/archive/2011/07/29/2120580.html

转载于:https://www.cnblogs.com/101rico/archive/2013/01/20/2868401.html

你可能感兴趣的文章
ArcGIS多面体(multipatch)解析——引
查看>>
css3渐变画斜线 demo
查看>>
JS性能DOM优化
查看>>
HAL层三类函数及其作用
查看>>
Odoo 去掉 恼人的 "上午"和"下午"
查看>>
web@h,c小总结
查看>>
java编程思想笔记(一)——面向对象导论
查看>>
Data Structure 基本概念
查看>>
Ubuntu改坏sudoers后无法使用sudo的解决办法
查看>>
NEYC 2017 游记
查看>>
[搬运] 写给 C# 开发人员的函数式编程
查看>>
Python之旅Day14 JQuery部分
查看>>
core--线程池
查看>>
redux-effect
查看>>
Android轻量级的开源缓存框架ASimpleCache
查看>>
他山之石:加载图片的一个小问题
查看>>
shell - 常识
查看>>
linux下编译复数类型引发的错误:expected unqualified-id before '(' token
查看>>
codeforces 1041A Heist
查看>>
Spring Cloud Stream消费失败后的处理策略(三):使用DLQ队列(RabbitMQ)
查看>>