SpringMVC系列(四)注解方式上传文件

本文介绍SpringMVC上传文件的两种方式,通过引入解析器优化上传效率,避免服务器验证,推荐使用前台验证提高传输效率。


本文主要介绍SpringMVC上传文件的两种方式

第二种较第一种而言,采用了解析器,大大提高了上传的效率。

 

第一种:

步骤:

1、引入jar包

2、配置spring-servlet.xml文件

  1. <!-- SpringMVC上传文件时,需要配置MultipartResolver处理器 -->    
  2.  <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">    
  3.      <property name="defaultEncoding" value="UTF-8"/>    
  4.      <!-- 指定所上传文件的总大小不能超过200KB。注意maxUploadSize属性的限制不是针对单个文件,而是所有文件的容量之和 -->    
  5.      <property name="maxUploadSize" value="200000"/>    
  6.      <property name="defaultEncoding" value="utf-8" />              
  7.       <property name="maxInMemorySize" value="40960" />    
  8.  </bean>    
  9.      
  10.  <!-- SpringMVC在超出上传文件限制时,会抛出org.springframework.web.multipart.MaxUploadSizeExceededException -->    
  11.  <!-- 该异常是SpringMVC在检查上传的文件信息时抛出来的,而且此时还没有进入到Controller方法中 -->    
  12.  <bean id="exceptionResolver" class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">    
  13.      <property name="exceptionMappings">    
  14.          <props>    
  15.              <!-- 遇到MaxUploadSizeExceededException异常时,自动跳转到/WEB-INF/jsp/error_fileupload.jsp页面 -->    
  16.              <prop key="org.springframework.web.multipart.MaxUploadSizeExceededException">error_fileupload</prop>    
  17.          </props>    
  18.      </property>    
  19.  </bean>  


3、写jsp

        文件上传方式,必须要采用POST!

        设置表单的编码方式,必须为enctype="multipart/form-data">

  1. <h>上传</h>    
  2. <form name="userForm" action="/springMVC7/file/upload" method="post" enctype="multipart/form-data">    
  3.         选择文件:<input type="file" name="filename">    
  4.         <input type="submit" value="提交">    
  5. </form>   

 

4、写Controller

        利用springMVC封装好的上传文件的方法,用注解的方式拿到JSP中的文件。(@RequestParam("filename")

  1. @Controller  
  2. @RequestMapping("/file")  
  3. public class index {  
  4.   
  5.     @RequestMapping(value = "/upload1")  
  6.     public String addUser(@RequestParam("filename") CommonsMultipartFile file,  
  7.             HttpServletRequest request) throws IOException {  
  8.   
  9.         if (!file.isEmpty()) {  
  10.             try {  
  11.                 // 拿到输出流,同时重命名上传的文件  
  12.                 FileOutputStream os = new FileOutputStream("D:/" + new Date().getTime()  
  13.                         + file.getOriginalFilename());  
  14.                 // 拿到上传文件的输入流  
  15.                 InputStream in = file.getInputStream();  
  16.                 // 以写字节的方式写文件  
  17.                 int b = 0;  
  18.                 while ((b = in.read()) != -1) {  
  19.                     os.write(b);  
  20.                 }  
  21.                 os.flush();  
  22.                 os.close();  
  23.                 in.close();  
  24.             } catch (FileNotFoundException e) {       
  25.                 e.printStackTrace();  
  26.             }  
  27.         }  
  28.   
  29.         return "success";  
  30.     }  

 

第二种:优化上传文件

思路:使用解析器,大大提高了上传速度

与方法一的区别仅在于Controller

  1. @RequestMapping("/upload2")  
  2. public String upload2(HttpServletRequest request, HttpServletResponse response)  
  3.         throws IllegalStateException, IOException {  
  4.     // 创建一个通用的多部分解析器 ,用于解析SpringMVC的上下文  
  5.     CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(request  
  6.             .getSession().getServletContext());  
  7.     // 解析request,判断是否为MultipartFile类型数据,即多部分请求  
  8.     if (multipartResolver.isMultipart(request)) {  
  9.         // 转换成多部分request  
  10.         MultipartHttpServletRequest multiRequest = (MultipartHttpServletRequest) request;  
  11.         // 取得request中的所有文件名  
  12.         Iterator<String> iter = multiRequest.getFileNames();  
  13.         while (iter.hasNext()) {  
  14.             // 取得上传文件  
  15.             MultipartFile file = multiRequest.getFile(iter.next());  
  16.             if (file != null) {  
  17.                 // 取得当前上传文件的文件名称  
  18.                 String myFileName = file.getOriginalFilename();  
  19.                 // 如果名称不为“”,说明该文件存在,否则说明该文件不存在  
  20.                 if (myFileName.trim() != "") {  
  21.                     // 重命名上传后的文件名  
  22.                     String fileName = new Date().getTime()  
  23.                             + file.getOriginalFilename();  
  24.                     /* 
  25.                      * //定义上传路径 String path = "H:/" + fileName; File 
  26.                      * localFile = new File(path); // 
  27.                      * 把文件拷贝到本地:transferTo(gest)将上传文件写到服务器指定文件上 
  28.                      * file.transferTo(localFile); 
  29.                      */  
  30.   
  31.                     // 如果用的是Tomcat服务器,则文件会上传到\\%TOMCAT_HOME%\\webapps\\YourWebProject\\WEB-INF\\upload\\文件夹中  
  32.                     String realPath = request.getSession().getServletContext()  
  33.                             .getRealPath("/WEB-INF/upload");  
  34.                     // 不必处理IO流关闭的问题,因为FileUtils.copyInputStreamToFile()方法内部会自动把用到的IO流关掉  
  35.                     FileUtils.copyInputStreamToFile(file.getInputStream(), new File(  
  36.                             realPath, fileName));  
  37.                 }  
  38.             }  
  39.         }  
  40.     }  
  41.     return "/success";  
  42. <span style="font-family:Microsoft YaHei;">}</span>  


 

总结:

        本文主要介绍SpringMVC上传文件的两种方式。利用SpringMVC对上传文件封装的方法,做上传操作。

        第二种较第一种而言,采用了解析器,大大提高了上传的效率。

        当然,并不建议使用SpringMVC的上传方式,因为此时是将文件先上传到服务器后,才做验证!

        推荐使用前台JQuery等上传文件的方式,只需要在浏览器做验证即可,不需要提交服务器,更加提高传输效率。

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值