参考博文:http://tzwzero-163-com.iteye.com/blog/1697184java
----------------------------------------如下是该文引用,红色部分是我添加了一句话---------------------------------web
必须明确告诉DispatcherServlet如何处理MultipartRequest。spring
SpringMVC中提供了文件上传使用方式以下apache
配置xxx-servlet.xml,添加以下代码:服务器
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <!-- 设置上传文件的最大尺寸为1MB --> <property name="maxUploadSize"> <value>1048576</value> </property> </bean>
注意这里的文件尺寸实际上只的是因此文件总大小app
若是配置了文件大小就觉得这你须要配置异常信息控制jsp
因此须要配置异常显示
spa
Xml代码 code
<!-- SpringMVC在超出上传文件限制时,会抛出org.springframework.web.multipart.MaxUploadSizeExceededException --> <!-- 该异常是SpringMVC在检查上传的文件信息时抛出来的,并且此时尚未进入到Controller方法中 --> <bean id="exceptionResolver" class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"> <property name="exceptionMappings"> <props> <!-- 遇到MaxUploadSizeExceededException异常时,自动跳转到/WEB-INF/jsp/error_fileupload.jsp页面 --> <prop key="org.springframework.web.multipart.MaxUploadSizeExceededException">error_fileupload</prop> </props> </property> </bean>
或者偷懒点,不设置大小,则最终默认是值为不限制。若是非要控制返回信息,能够考虑在地应以的异常处理中返回指定格式数据,例如JSON
配置完了页面上一如既往的须要再form表单中增长:enctype="multipart/form-data"
而后就是须要处理的action了,能够有两种方式
第一种方式:
public String login( @RequestParam MultipartFile file, Model model) { ……………… }
其中file的名字必须保证与<input type=file>中的那么属性值保持一致,若果是多文件上传,则考虑使用,多文件上传时各file名也必须一致,不然上传不成功
Java代码
public String login(@Valid UserInfo userInfo, BindingResult result, @RequestParam MultipartFile[] files, Model model) { ……………… }
单文件能够省略 @RequestParam 多文件则不可省略
第二种方式:
这样也能够获取到文件
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception { // 转型为MultipartHttpRequest: MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request; // 得到文件: MultipartFile file = multipartRequest.getFile(" file "); }
其实刚才首先须要配置是加入两个 jar包:
commons-fileupload-1.2.2.jar
commons-io-2.1.jar
--------------------------------------------------引用结束--------------------------------------------------------------------------
//No.1 本方法是文件+文本域等混合的上传 @RequestMapping("/upload-mvc-txt.do") public String handleFormUpload(@RequestParam MultipartFile[] file1, HttpServletRequest request) { String path = request.getSession().getServletContext().getRealPath("/") + "/upload/"; for(MultipartFile ufile : file1){ if (!ufile.isEmpty()) { System.out.println(path); File file = new File(path + new Date().getTime() + ".jpg"); //服务器上新建文件 try { FileUtils.copyInputStreamToFile(ufile.getInputStream(), file); Thread.sleep(1000); } catch (Exception e) { e.printStackTrace(); } } } String uname = request.getParameter("user_name"); System.out.println(uname); return "success"; } @RequestMapping("/upload-mvc.do") public String handleFormUpload(MultipartFile file1, HttpServletRequest request) { //请求参数必定要与form中的参数名对应 System.out.println(file1.getSize()); if (!file1.isEmpty()) { String path = request.getSession().getServletContext().getRealPath("/") + "/upload/"; System.out.println(path); File file = new File(path + new Date().getTime() + ".jpg"); //新建一个文件 try { FileUtils.copyInputStreamToFile(file1.getInputStream(), file); } catch (Exception e) { e.printStackTrace(); } return "success"; //返回成功视图 }else { return "error"; //返回失败视图 } } /** * 非 spring MVC 方式,即便用了普通的servlet的方式,若是使用了springMVC(需在xml中配置) * 此方法将不能正确的上传文件,缘由是spring mvc会把request从新封装,导致fileUpload.parseRequest(request); * 返回的list为空。(去掉响应配置便可使用本方法) * @param request * @param response * @return */ @RequestMapping("/upload.do") public String upPic(HttpServletRequest request, HttpServletResponse response) { String appPath = request.getSession().getServletContext().getRealPath("/"); try{ //判断Form是否为 multipart form boolean isMultipart = ServletFileUpload.isMultipartContent(request); if(isMultipart){ FileItemFactory fileItemFactory = new DiskFileItemFactory();//设置工厂 ServletFileUpload sfu = new ServletFileUpload(fileItemFactory); //这里就是中文文件名处理的代码,其实只有一行,setHeaderEncoding就能够了 sfu.setHeaderEncoding("utf-8"); List fileItemList = sfu.parseRequest(request);//解析上传文件数据包 for(int i=0;i<fileItemList.size();i++){ FileItem fileItem = (FileItem)fileItemList.get(i);//遍历每一个上传文件 if(!fileItem.isFormField()){//判断是否是上传的文件 String fullFileName = fileItem.getName();//文件全名 String fileName = getFileName(fullFileName);//文件名 //设置文件存储在服务器上的路径 String path = appPath + "/upload"; if(!new File(path).isDirectory())//若是不存在,则建立目录 new File(path).mkdirs(); File file = new File(path, fileName); fileItem.write(file); System.out.println("上传第" + i + "个文件"); } } } }catch(Exception e){ e.printStackTrace(); } return "success"; }
Spring MVC 对文件上传的支持和与apache-commons的两个组件的结合仍是很方便的,以上仅仅完成基本的上传功能,其余的细节和特性还有待进一步的尝试。