Spring中MultipartHttpServletRequest实现文件上传

时间:2022-12-13 17:05:19

实现图片上传 
  用户必须能够上传图片,因此需要文件上传的功能。比较常见的文件上传组件有Commons FileUpload(http://jakarta.apache.org/commons/fileupload/a>)和COS FileUpload(http://www.servlets.com/cos),spring已经完全集成了这两种组件,这里我们选择Commons FileUpload。 

       1) 在pom.xml中添加jar包

        <dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
            <version>1.3</version>
        </dependency>


  2) 由于Post一个包含文件上传的Form会以multipart/form-data请求发送给服务器,必须明确告诉DispatcherServlet如何处理MultipartRequest。首先在dispatcher-servlet.xml中声明一个MultipartResolver:

xml 代码
  1. <bean id="multipartResolver"  
  2.     class="org.springframework.web.multipart.commons.CommonsMultipartResolver">  
  3.     <!-- 设置上传文件的最大尺寸为1MB -->  
  4.     <property name="maxUploadSize">  
  5.         <value>1048576</value>  
  6.     </property>  
  7. </bean>  

 这样一旦某个Request是一个MultipartRequest,它就会首先被MultipartResolver处理,然后再转发相应的Controller。 
      3) 在UploadImageController中,将HttpServletRequest转型为MultipartHttpServletRequest,就能非常方便地得到文件名和文件内容:

java 代码
  1. public ModelAndView handleRequest(HttpServletRequest request,   
  2.             HttpServletResponse response) throws Exception {   
  3.         // 转型为MultipartHttpRequest:   
  4.         MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;   
  5.         // 获得文件:   
  6.         MultipartFile file = multipartRequest.getFile(" file ");   
  7.         // 获得文件名:   
  8.         String filename = file.getOriginalFilename();   
  9.         // 获得输入流:   
  10.         InputStream input = file.getInputStream();   
  11.         // 写入文件   
  12.   
  13.         // 或者:   
  14.         File source = new File(localfileName.toString());   
  15.         multipartFile.transferTo(source);   
  16.     }  
     4) 问题:        如果遇到MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;  
原因出现这个转换错误,是因为request根本没有转换成MultipartHttpServletRequest。所以可以采用另外一种方式解决:
     CommonsMultipartResolver commonsMultipartResolver = new CommonsMultipartResolver(request
                 .getSession().getServletContext());
      commonsMultipartResolver.setDefaultEncoding("utf-8");
       multipartRequest = commonsMultipartResolver.resolveMultipart(request);

相关文章