package com.xr.demo.cktest; import java.io.File; import java.io.IOException; import java.io.PrintWriter; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.Hashtable; import java.util.Iterator; import java.util.List; import java.util.Map; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; 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 = "/fileUpLoad/"; 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("<script type=\"text/javascript\">"); out.println("window.parent.CKEDITOR.tools.callFunction(" + callback + ",'" + fileUrl + "',''" + ")"); out.println("</script>"); 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; } }
最近下载更多
最近浏览更多
hugoddx2024 LV1
7月11日
whfuai LV14
2023年5月11日
qhdjod LV7
2023年4月1日
3029860453 LV2
2022年10月26日
asdfg01234 LV10
2021年10月25日
zero11 LV1
2021年9月30日
疯子也有疯子的情调 LV2
2021年8月24日
Destiny微斯人 LV6
2021年4月6日
最代码_小白 LV1
2020年12月28日
sunchao LV6
2020年11月17日