Jsp页面代码:
<script> var editor; KindEditor.ready(function(K) { editor = K.create(‘textarea[name="content"]‘, { uploadJson :$(‘#basePath‘).val() + ‘kindeditor/fileUpload‘, fileManagerJson : $(‘#basePath‘).val() + ‘kindeditor/fileManager‘, resizeType : 1, //2或1或0,2时可以拖动改变宽度和高度,1时只能改变高度,0时不能拖动。 dialogAlignType : ‘page‘, //设置弹出框(dialog)的对齐类型,可设置page和空,指定page时按当前页面居中,指定空时按编辑器居中。 allowPreviewEmoticons : true,//true时鼠标放在表情上可以预览表情。 items : [ ‘undo‘,‘redo‘,‘|‘,‘formatblock‘,‘fontname‘,‘fontsize‘, ‘|‘, ‘forecolor‘, ‘hilitecolor‘, ‘bold‘, ‘italic‘, ‘underline‘,‘strikethrough‘,‘removeformat‘, ‘|‘, ‘justifyleft‘, ‘justifycenter‘, ‘justifyright‘, ‘insertorderedlist‘,‘insertunorderedlist‘, ‘insertorderedlist‘,‘insertunorderedlist‘, ‘|‘, ‘emoticons‘, ‘image‘, ‘link‘,‘media‘, ‘table‘,‘hr‘,‘preview‘,‘flash‘,‘print‘,‘|‘,‘code‘,‘insertfile‘,‘baidumap‘,‘clearhtml‘,‘|‘,‘pagebreak‘,‘template‘,‘anchor‘], }); }); </script>
Jsp代码
Controllor代码:
import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.Comparator; 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 java.util.Random; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.fileupload.FileItemFactory; import org.apache.commons.fileupload.FileUploadException; import org.apache.commons.fileupload.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload; import org.codehaus.jackson.map.ObjectMapper; import org.springframework.stereotype.Controller; import org.springframework.util.FileCopyUtils; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartHttpServletRequest; @Controller @RequestMapping("kindeditor") public class UploadController { private static final ObjectMapper objectMapper = new ObjectMapper(); @RequestMapping(value = "/fileUpload", method = RequestMethod.POST) @ResponseBody public Map<String, Object> fileUpload(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException, FileUploadException { ServletContext application = request.getSession().getServletContext(); String savePath = application.getRealPath("/") + "images/"; // 文件保存目录URL String saveUrl = request.getContextPath() + "/images/"; // 定义允许上传的文件扩展名 HashMap<String, String> extMap = new HashMap<String, String>(); extMap.put("image", "gif,jpg,jpeg,png,bmp"); extMap.put("flash", "swf,flv"); extMap.put("media", "swf,flv,mp3,wav,wma,wmv,mid,avi,mp4,mpg,asf,rm,rmvb"); extMap.put("file", "doc,docx,xls,xlsx,ppt,htm,html,txt,zip,rar,gz,bz2"); // 最大文件大小 long maxSize = 1000000; response.setContentType("text/html; charset=UTF-8"); if (!ServletFileUpload.isMultipartContent(request)) { return getError("请选择文件。"); } // 检查目录 File uploadDir = new File(savePath); if (!uploadDir.isDirectory()) { return getError("上传目录不存在。"); } // 检查目录写权限 if (!uploadDir.canWrite()) { return getError("上传目录没有写权限。"); } String dirName = request.getParameter("dir"); if (dirName == null) { dirName = "image"; } if (!extMap.containsKey(dirName)) { return getError("目录名不正确。"); } // 创建文件夹 savePath += dirName + "/"; saveUrl += dirName + "/"; File saveDirFile = new File(savePath); if (!saveDirFile.exists()) { saveDirFile.mkdirs(); } SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd"); String ymd = sdf.format(new Date()); savePath += ymd + "/"; saveUrl += ymd + "/"; File dirFile = new File(savePath); if (!dirFile.exists()) { dirFile.mkdirs(); } FileItemFactory factory = new DiskFileItemFactory(); ServletFileUpload upload = new ServletFileUpload(factory); upload.setHeaderEncoding("UTF-8"); MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request; Iterator item = multipartRequest.getFileNames(); while (item.hasNext()) { String fileName = (String) item.next(); MultipartFile file = multipartRequest.getFile(fileName); // 检查文件大小 if (file.getSize() > maxSize) { return getError("上传文件大小超过限制。"); } // 检查扩展名 String fileExt = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf(".") + 1).toLowerCase(); if (!Arrays. asList(extMap.get(dirName).split(",")).contains(fileExt)) { return getError("上传文件扩展名是不允许的扩展名。\n只允许" + extMap.get(dirName) + "格式。"); } SimpleDateFormat df = new SimpleDateFormat("yyyyMMddHHmmss"); String newFileName = df.format(new Date()) + "_" + new Random().nextInt(1000) + "." + fileExt; try { File uploadedFile = new File(savePath, newFileName); FileCopyUtils.copy(file.getInputStream(), new FileOutputStream(uploadedFile)); } catch (Exception e) { return getError("上传文件失败。"); } Map<String, Object> msg = new HashMap<String, Object>(); msg.put("error", 0); msg.put("url", saveUrl + newFileName); return msg; } return null; } private Map<String, Object> getError(String message) { Map<String, Object> msg = new HashMap<String, Object>(); msg.put("error", 1); msg.put("message", message); return msg; } @RequestMapping(value = "/fileManager", method = RequestMethod.POST) public void fileManager(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { ServletContext application = request.getSession().getServletContext(); ServletOutputStream out = response.getOutputStream(); // 根目录路径,可以指定绝对路径,比如 /var/www/attached/ String rootPath = application.getRealPath("/") + "images/"; // 根目录URL,可以指定绝对路径,比如 http://www.yoursite.com/attached/ String rootUrl = request.getContextPath() + "/images/"; // 图片扩展名 String[] fileTypes = new String[] { "gif", "jpg", "jpeg", "png", "bmp" }; String dirName = request.getParameter("dir"); if (dirName != null) { if (!Arrays.<String> asList( new String[] { "image", "flash", "media", "file" }) .contains(dirName)) { out.println("Invalid Directory name."); return; } rootPath += dirName + "/"; rootUrl += dirName + "/"; File saveDirFile = new File(rootPath); if (!saveDirFile.exists()) { saveDirFile.mkdirs(); } } // 根据path参数,设置各路径和URL String path = request.getParameter("path") != null ? request .getParameter("path") : ""; String currentPath = rootPath + path; String currentUrl = rootUrl + path; String currentDirPath = path; String moveupDirPath = ""; if (!"".equals(path)) { String str = currentDirPath.substring(0, currentDirPath.length() - 1); moveupDirPath = str.lastIndexOf("/") >= 0 ? str.substring(0, str.lastIndexOf("/") + 1) : ""; } // 排序形式,name or size or type String order = request.getParameter("order") != null ? request .getParameter("order").toLowerCase() : "name"; // 不允许使用..移动到上一级目录 if (path.indexOf("..") >= 0) { out.println("Access is not allowed."); return; } // 最后一个字符不是/ if (!"".equals(path) && !path.endsWith("/")) { out.println("Parameter is not valid."); return; } // 目录不存在或不是目录 File currentPathFile = new File(currentPath); if (!currentPathFile.isDirectory()) { out.println("Directory does not exist."); return; } // 遍历目录取的文件信息 List<Hashtable> fileList = new ArrayList<Hashtable>(); if (currentPathFile.listFiles() != null) { for (File file : currentPathFile.listFiles()) { Hashtable<String, Object> hash = new Hashtable<String, Object>(); String fileName = file.getName(); if (file.isDirectory()) { hash.put("is_dir", true); hash.put("has_file", (file.listFiles() != null)); hash.put("filesize", 0L); hash.put("is_photo", false); hash.put("filetype", ""); } else if (file.isFile()) { String fileExt = fileName.substring( fileName.lastIndexOf(".") + 1).toLowerCase(); hash.put("is_dir", false); hash.put("has_file", false); hash.put("filesize", file.length()); hash.put("is_photo", Arrays.<String> asList(fileTypes) .contains(fileExt)); hash.put("filetype", fileExt); } hash.put("filename", fileName); hash.put("datetime", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(file .lastModified())); fileList.add(hash); } } if ("size".equals(order)) { Collections.sort(fileList, new SizeComparator()); } else if ("type".equals(order)) { Collections.sort(fileList, new TypeComparator()); } else { Collections.sort(fileList, new NameComparator()); } Map<String, Object> msg = new HashMap<String, Object>(); msg.put("moveup_dir_path", moveupDirPath); msg.put("current_dir_path", currentDirPath); msg.put("current_url", currentUrl); msg.put("total_count", fileList.size()); msg.put("file_list", fileList); response.setContentType("application/json; charset=UTF-8"); String msgStr = objectMapper.writeValueAsString(msg); out.println(msgStr); } class NameComparator implements Comparator { public int compare(Object a, Object b) { Hashtable hashA = (Hashtable) a; Hashtable hashB = (Hashtable) b; if (((Boolean) hashA.get("is_dir")) && !((Boolean) hashB.get("is_dir"))) { return -1; } else if (!((Boolean) hashA.get("is_dir")) && ((Boolean) hashB.get("is_dir"))) { return 1; } else { return ((String) hashA.get("filename")) .compareTo((String) hashB.get("filename")); } } } class SizeComparator implements Comparator { public int compare(Object a, Object b) { Hashtable hashA = (Hashtable) a; Hashtable hashB = (Hashtable) b; if (((Boolean) hashA.get("is_dir")) && !((Boolean) hashB.get("is_dir"))) { return -1; } else if (!((Boolean) hashA.get("is_dir")) && ((Boolean) hashB.get("is_dir"))) { return 1; } else { if (((Long) hashA.get("filesize")) > ((Long) hashB .get("filesize"))) { return 1; } else if (((Long) hashA.get("filesize")) < ((Long) hashB .get("filesize"))) { return -1; } else { return 0; } } } } class TypeComparator implements Comparator { public int compare(Object a, Object b) { Hashtable hashA = (Hashtable) a; Hashtable hashB = (Hashtable) b; if (((Boolean) hashA.get("is_dir")) && !((Boolean) hashB.get("is_dir"))) { return -1; } else if (!((Boolean) hashA.get("is_dir")) && ((Boolean) hashB.get("is_dir"))) { return 1; } else { return ((String) hashA.get("filetype")) .compareTo((String) hashB.get("filetype")); } } } }
Java代码
注意点:
1、需在项目根目录下新建images目录,并根据上传文件来创建子文件,若文件为图片则新建image,若文件为视频则新建media,具体可参看Controllor中的代码内容。
2、由于需要在编辑器中回显上传的图片,所以需要用到类似 “../images/*” 这样的文件路径,所以需要在web.xml文件中打开该类路径的访问权限。如下代码:
<filter> <filter-name>HiddenHttpMethodFilter</filter-name> <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class> </filter> <filter-mapping> <filter-name>HiddenHttpMethodFilter</filter-name> <servlet-name>springServlet</servlet-name> </filter-mapping> <!-- <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>/*</url-pattern> </servlet-mapping> --> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>/resources/*</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>/images/*</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.htm</url-pattern> <!-- 出現PageNotFound No mapping found for HTTP request with URI 時,說明不能直接用路徑打開,需要在這邊打開“開關”--> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.html</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.ico</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>/userfiles/*</url-pattern> </servlet-mapping>
web.xml
时间: 2024-10-12 03:41:58