1:使用SpringMVC 实现批量上传
报错:**.SecurityContextHolderAwareRequestWrapper can not be cast to **.DefaultMultipartHttpServletRequest
使用springmvc上传要加上
<bean id=”multipartResolver” class=”org.springframework.web.multipart.commons.CommonsMultipartResolver”> <property name="maxUploadSize" value="400000" /> </bean>
Action处理
@RequestMapping(value = "/upload.htm") public static void uploadmutiFiles(HttpServletRequest req, HttpServletResponse res, ModelAndView model) { String path = req.getSession().getServletContext() .getRealPath("/upload/"); // 获取本地存储路径 MultipartHttpServletRequest mul = (MultipartHttpServletRequest) req; List<MultipartFile> files = mul.getFiles("file"); String msg = "上传成功"; try { for (int i = 0; i < files.size(); i++) { CommonsMultipartFile mf = (CommonsMultipartFile) files.get(i); File file = new File(path + "/" + mf.getOriginalFilename()); int index = mf.getOriginalFilename().lastIndexOf("."); String filename = mf.getOriginalFilename().substring(0, index); String extendname = mf.getOriginalFilename().substring(index); int ex = 1; while (file.exists()) { file = new File(path + "/" + filename + "(" + ex + ")" + extendname); ex++; } mf.getFileItem().write(file); } } catch (Exception e) { msg = "上传失败"; e.printStackTrace(); } try { res.getWriter().print(msg); } catch (IOException e) { e.printStackTrace(); } }
2 but kindeditor 编辑器就不可用了,因为编辑器用的一般的上传,spring mvc上传的话request 就不是一般性的http协议请求,而编辑器用的是普通http协议传输的HttpServletRequest,如果用编辑器默认的上传代码,这样的话报错会反过来,会自动的转换成MultipartHttpServletRequest,转换报错.
解决办法: 去掉那<bean>配置,修改上传方法,注意表单中file的name属性值与mul.getFiles("xxx"); 一一对应
,否则文件无法获取
public static void uploadmutiFiles(HttpServletRequest request, HttpServletResponse res, ModelAndView model) { CommonsMultipartResolver commonsMultipartResolver = new CommonsMultipartResolver(request.getSession().getServletContext()); commonsMultipartResolver.setDefaultEncoding("utf-8"); String path = request.getSession().getServletContext().getRealPath("/upload/"); // 获取本地存储路径 String msg = "上传成功"; try { if (commonsMultipartResolver.isMultipart(request)){ MultipartHttpServletRequest mul = commonsMultipartResolver.resolveMultipart(request); List<MultipartFile> files = mul.getFiles("file"); // 这里可以用mul.getParamter("xxxx"); for (int i = 0; i < files.size(); i++) { CommonsMultipartFile mf = (CommonsMultipartFile) files.get(i); File file = new File(path + "/" + mf.getOriginalFilename()); int index = mf.getOriginalFilename().lastIndexOf("."); String filename = mf.getOriginalFilename().substring(0, index); String extendname = mf.getOriginalFilename().substring(index); int ex = 1; while (file.exists()) { file = new File(path + "/" + filename + "(" + ex + ")" + extendname); ex++; } mf.getFileItem().write(file); } } } catch (Exception e) { msg = "上传失败"; e.printStackTrace(); } try { res.getWriter().print(msg); } catch (IOException e) { e.printStackTrace(); } }
问题搞定,而且和任何编辑器没任何挂噶。
3 but 一般上传form需要加上enctype="multipart/form-data",但是DTO无法获取了,参考文
解决办法:spring mvc 多个配置 默认的web-main.xml 不加
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <property name="maxUploadSize" value="1048576" /> <property name="defaultEncoding" value="utf8" /> </bean>
而利用spring mvc上传文件的配置中(名字随意 如web-main-image.xml )加上它,其他的配置属性相同。
web.xml 配置上传的分发器,指定springmvc 配置文件位置
<servlet> <servlet-name>springServletImage</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>WEB-INF/config/spring/web/web-main-image.xml</param-value> </init-param> <load-on-startup>2</load-on-startup> </servlet>
不过重复的配置很烦人,web-main-image.xml 可以就把multipartResolver配置,其他配置不要,但是下面的param-value要指定默认的配置文件和web-main-image.xml两个文件,指定两个以都好分割就好了。<param-value>WEB-INF/config/spring/web/web-main.xml,WEB-INF/config/spring/web/web-main-image.xml</param-value>
< textarea id="content" name = "content" value="$!{obj.content}" ></textarea>
指定相应的方法约束用MultipartHttpServletRequest (只有配置这个的方法才用springmvc的上传)
<servlet-mapping> <servlet-name>springServletImage</servlet-name> <url-pattern>/projectpart/mangage/xxx.htm</url-pattern> </servlet-mapping>
OK 配置完成,spring 对象绑定成功。上传的方法都添加一个sevlet-mapping 只是url-pattern 不同而已。
在页面层凡是上传的都必须加上enctype="multipart/form-data",否则request不是DefaultMultipartHttpServletRequest,就无法获取DTO,所以必须加上enctype属性。不能直接输入请求地址,直接输入的话还是默认的request
4 KindEditor 使用默认的HttpServletRequest,这个也可以用MultipartHttpServletRequest,为了灵活,使用默认的HttpServletRequest
页面调用:
<textarea id="content" name = "content" value="$!{obj.content}" ></textarea>
引用JS:
<script src="$!{basepath}/common/kindeditor/kindeditor-min.js"></script>
<script src="$!{basepath}/common/kindeditor/lang/zh_CN.js"></script>
编辑器调用:这个在jquery中$()里面调用,uploadJson指定相应的action的方法
KindEditor.ready(function(K) { var editor1 = K.create('textarea[id="content"]', { cssPath : appServer+'/common/kindeditor/plugins/code/prettify.css', uploadJson : appServer+'/xxxupload.htm', allowFileManager : true, afterCreate : function() { var self = this; K.ctrl(document, 13, function() { self.sync(); document.forms['example'].submit(); }); K.ctrl(self.edit.doc, 13, function() { self.sync(); document.forms['example'].submit(); }); } }); prettyPrint(); });
Action处理: 上传方法使用编辑器默认的代码处理:
@RequestMapping(value = "/xxxupload.htm")
public void xxxUpload(HttpServletRequest request, HttpServletResponse response, ModelMap model) { PrintWriter out = null; try { out = response.getWriter(); // 文件保存目录路径 String savePath = request.getRealPath("//") + "//attached//xxxuploadFolder//"; // 文件保存目录URL String saveUrl = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + request.getContextPath() + "/attached/teambuy/"; // 定义允许上传的文件扩展名 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,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)) { out.println(getError("请选择文件。")); return; } // 检查目录 File uploadDir = new File(savePath); if (!uploadDir.isDirectory()) { out.println(getError("上传目录不存在。")); return; } // 检查目录写权限 if (!uploadDir.canWrite()) { out.println(getError("上传目录没有写权限。")); return; } String dirName = request.getParameter("dir"); if (dirName == null) { dirName = "image"; } if (!extMap.containsKey(dirName)) { out.println(getError("目录名不正确。")); return; } // 创建文件夹 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"); List items = upload.parseRequest(request); Iterator itr = items.iterator(); while (itr.hasNext()) { FileItem item = (FileItem) itr.next(); String fileName = item.getName(); long fileSize = item.getSize(); if (!item.isFormField()) { // 检查文件大小 if (item.getSize() > maxSize) { out.println(getError("上传文件大小超过限制。")); return; } // 检查扩展名 String fileExt = fileName.substring( fileName.lastIndexOf(".") + 1).toLowerCase(); if (!Arrays.<String> asList(extMap.get(dirName).split(",")) .contains(fileExt)) { out.println(getError("上传文件扩展名是不允许的扩展名。\n只允许" + extMap.get(dirName) + "格式。")); return; } SimpleDateFormat df = new SimpleDateFormat("yyyyMMddHHmmss"); String newFileName = df.format(new Date()) + "_" + new Random().nextInt(1000) + "." + fileExt; try { File uploadedFile = new File(savePath, newFileName); System.out.print(newFileName); item.write(uploadedFile); } catch (Exception e) { out.println(getError("上传文件失败。")); return; } JSONObject obj = new JSONObject(); obj.put("error", 0); obj.put("url", saveUrl + newFileName); out.println(obj.toJSONString()); } } } catch (Exception e1) { e1.printStackTrace(); } }