前文说到springMVC映射普通表单的开发方法,接下来讨论如何使用springmvc上传单个文件。
springmvc对form表单的支持已经很成熟,仅仅两步:
- 配置支持文件上传的bean:org.springframework.web.multipart.commons.CommonsMultipartResolver
同时设置文件编码、单次提交表单上传文件最大字节数、以及写文件时使用的缓冲区大小 -
开发处理:handler[org.hy.ssm.web.controller.FormController.uploadOne(MultipartFile)]
/** * @Title: uploadOne * @Description: 单文件上传 * @param file * @return ModelMap */ @RequestMapping("/uploadOne") @ResponseBody public ModelMap uploadOne(MultipartFile file) { final String UPLOAD_DIR = "/upload/"; final String KEY_OF_ORIGINAL_FILE_NAME = "origFileName"; final String KEY_OF_FILE_URL = "fileUrl"; final String KEY_OF_FILE_SUFFIX = "fileSuffix"; boolean flag = false; String message = null; Map<String, String> data = Maps.newHashMap(); // 原文件名(通常用于下载展示) String originalFilename = file.getOriginalFilename(); data.put(KEY_OF_ORIGINAL_FILE_NAME, originalFilename); // 文件类型(后缀) String suffix = FileUtil.getSuffix(originalFilename); data.put(KEY_OF_FILE_SUFFIX, suffix); // 目标文件名(通常情况需要重命名, 防止同名文件覆盖) String fileName = String.valueOf(System.currentTimeMillis()) + suffix; String fileUrl = (UPLOAD_DIR + fileName); data.put(KEY_OF_FILE_URL, fileUrl); try { File dest = WebUtil.getFile(fileUrl); file.transferTo(dest); flag = true; } catch (Exception e) { flag = false; message = ""; LOGGER.warn(message + " : " + e.getMessage(), e); } return WebUtil.getModelMap(flag, data, message); }
接下来验证结果是否正确:
- 正常验证
- 非法验证,文件大小超出。当前测试数据70+MB
org.springframework.web.multipart.MaxUploadSizeExceededException: Maximum upload size of 32505856 bytes exceeded; nested exception is org.apache.commons.fileupload.FileUploadBase$SizeLimitExceededException: the request was rejected because its size (79882924) exceeds the configured maximum (32505856) at org.springframework.web.multipart.commons.CommonsMultipartResolver.parseRequest(CommonsMultipartResolver.java:160) at org.springframework.web.multipart.commons.CommonsMultipartResolver.resolveMultipart(CommonsMultipartResolver.java:139) at org.springframework.web.servlet.DispatcherServlet.checkMultipart(DispatcherServlet.java:1020) at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:883) at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:852) at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:882) at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:789) at javax.servlet.http.HttpServlet.service(HttpServlet.java:646) at javax.servlet.http.HttpServlet.service(HttpServlet.java:727) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:504) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103) at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:421) at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1074) at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:611) at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:316) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.lang.Thread.run(Thread.java:722) Caused by: org.apache.commons.fileupload.FileUploadBase$SizeLimitExceededException: the request was rejected because its size (79882924) exceeds the configured maximum (32505856) at org.apache.commons.fileupload.FileUploadBase$FileItemIteratorImpl.<init>(FileUploadBase.java:937) at org.apache.commons.fileupload.FileUploadBase.getItemIterator(FileUploadBase.java:331) at org.apache.commons.fileupload.FileUploadBase.parseRequest(FileUploadBase.java:351) at org.apache.commons.fileupload.servlet.ServletFileUpload.parseRequest(ServletFileUpload.java:126) at org.springframework.web.multipart.commons.CommonsMultipartResolver.parseRequest(CommonsMultipartResolver.java:156) ... 28 more
由错误也可定位出,#multipartResolver.maxUploadSize 是用来定位单次表单提交时,文件的限定大小
到此,单文件上传已经搞定。是不是很简单呢?当然了还有稍微原始的方法,通过 org.apache.commons.fileupload.servlet.ServletFileUpload 也能实现文件上传的功能,在此不做详解。大致步骤如下:
- 获取工厂 DiskFileItemFactory
- 通过工厂获取上传组件 ServletFileUpload
- 解析请求获取表单项
- 判断表单项类型
- 解析表单项
/** * @Title: uploadByFileUpload * @Description: 使用Commons.FileUpload上传文件 */ @RequestMapping("/uploadByFileUpload") public void uploadByFileUpload() { final String UPLOAD_DIR = "upload/"; final String basePath = WebUtil.getBaseFilPath(); HttpServletRequest request = WebUtil.getRequest(); try { // 防止中文名乱码 request.setCharacterEncoding("utf-8"); // 1. 获取工厂 DiskFileItemFactory DiskFileItemFactory fileItemFactory = new DiskFileItemFactory(); // 缓存区目录 fileItemFactory.setRepository(new File(basePath + "tmp/")); // 缓存区大小 fileItemFactory.setSizeThreshold(1024 * 6); // 2. 通过工厂获取上传组件 ServletFileUpload ServletFileUpload servletFileUpload = new ServletFileUpload(fileItemFactory); // 设置文件的大小为2M servletFileUpload.setSizeMax(1024 * 1024 * 2); // 防止中文乱码(文件名) servletFileUpload.setHeaderEncoding("UTF-8"); // 3. 解析请求获取表单项 @SuppressWarnings("unchecked") List<FileItem> items = servletFileUpload.parseRequest(request); // 4. 判断表单项类型 for (FileItem item : items) { // 5. 解析表单项 // 表单项名称 String fieldName = item.getFieldName(); if (item.isFormField()) { // 普通表单项处理 String name = fieldName; String value = item.getString("UTF-8"); System.out.println(name + ":" + value); } else { // 文件表单项 // 获取文件名 String originalFileName = item.getName(); String suffix = FileUtil.getSuffix(originalFileName); String newFileName = String.valueOf(System.currentTimeMillis()); // 写入文件 String fileName = File.separator + newFileName + suffix; File newFile = FileUtil.createQuietly(basePath + UPLOAD_DIR + fileName); item.write(newFile); item.delete(); } } } catch (Exception e) { LOGGER.warn(e.getMessage(), e); } }
注意:如果使用上面的方式获取上传文件,需要停止 springmvc 的文件解析机制,否则将不能获取数据 !!
源码下载:ssmFU.zip
相关推荐
NULL 博文链接:https://dayongge.iteye.com/blog/2269217
NULL 博文链接:https://dayongge.iteye.com/blog/2268894
NULL 博文链接:https://wujiu.iteye.com/blog/2012300
springmvc form表单的使用。 简单的说明了如何使用form表单并绑定pojo,包括主子表的form请求到一个pojo
Servlet、Struts、SpringMVC对于表单重复提交的解决方案
springMVC文件上传完美 demo,自带 jar包, 前后台代码 ,表单上传,项目直接导入即可!
SpringMVC表单标签简介
SpringMVC入门很简单之表单标签,具体参考博文: http://www.cnblogs.com/liukemng/tag/SpringMVC/
springmvc 第二个例子(接收表单参数+重定向)
springmvc的服务器表单校验所需要的jar包,分别为:classmate.jar、classmate.jar、hibernate-validator-annotation-processor-5、hibernate-validator-annotation-processor-5、validation-api-1.1.0.jar
本项目为springMVC表单验证简单实例,支持国际化,发布就可以试验效果, 访问路如:http://localhost:8080/springMVC_Validator/register.mvc
实现文件上传的思路: 1、创建form表单,...3、在SpringMVC配置文件中加入文件上传的解析器配置:CommonsMultipartReslover,id要严格写死:multipartReslover。 4、引入文件上传的相关依赖:commons-fileupload
/login2.do"提交表单页面发送login2.do请求,而LoginControlle类中r的@RequestMapping("/login2.do")注解请求映射路径login2.do进行转发;前提是页面表单提交那个请求路径,就要在LoginController类中注释掉该请求...
SpringMVC之简单使用,利用jsp技术实现简单的表单验证和网页登录
这是我的这篇博文的源码:SpringMVC与SiteMesh2.4无缝整合并借助JSR303规范实现表单验证,博文地址:http://blog.csdn.net/jadyer/article/details/7574668
使用ajaxSubmit文件上传。
为了能上传文件,必须将表单的method设置为POST,并将enctype设置为multipart/form-data。只有在这样的情况下,浏览器才会把用户选择的文件以二进制数据发送给服务器。 一旦设置了enctype为multipart/form-data,...
本篇文章主要介绍了springMVC中基于token防止表单重复提交方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
假如今天配置新的一个组件,称之为文件解析器,再点上传的时候,控制器会调用文件解析器,文件解析器可以帮助我们解析请求,解析request,解析完request,可以拿到上传文件项,就可以返回一个upload。后面继续执行...