zoukankan      html  css  js  c++  java
  • SpringMVC中servletFileUpload.parseRequest(request)解析为空获取不到数据问题

    [-]

    1. 原因分析
    2. 解决方案

    原因分析

    首先我们来看下Spring mvc 中文件上传的配置

    1. <bean id="multipartResolver"  
    2.         class="org.springframework.web.multipart.commons.CommonsMultipartResolver">  
    3.         <property name="defaultEncoding" value="UTF-8" />  
    4.   
    5.         <property name="maxUploadSize" value="2000000000" />  
    6.     </bean>  


    再来看看Controller中使用

    1. public void upload2(HttpServletRequest request) {  
    2.         // 转型为MultipartHttpRequest  
    3.         try {  
    4.             MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;  
    5.             List<MultipartFile> fileList = multipartRequest.getFiles("file");  
    6.             for (MultipartFile mf : fileList) {  
    7.                 if(!mf.isEmpty()){  
    8.                       
    9.                 }  
    10.             }  
    11.         } catch (Exception e) {  
    12.             e.printStackTrace();  
    13.         }  
    14.           
    15.     }  

    方式二

    1. public String upload(HttpServletRequest request,  
    2.             @RequestParam(value = "file") MultipartFile[] files) {  
    3.         try {  
    4.             for (MultipartFile mf : files) {  
    5.                 if(!mf.isEmpty()){  
    6.                       
    7.                 }  
    8.             }  
    9.   
    10.         } catch (Exception e) {  
    11.             e.printStackTrace();  
    12.         }  
    13.         return "upload";  
    14.     }  


    这里springMVC 都为我们封装好成自己的文件对象了,转换的过程就在我们所配置的CommonsMultipartResolver这个转换器里面下面再来看看它的源码


    他的转换器里面就是调用common-fileupload的方式解析,然后再使用parseFileItems()方法封装成自己的文件对象 . 

    1. List<FileItem> fileItems = ((ServletFileUpload) fileUpload).parseRequest(request);  


    大家应该发现了上面的这句代码,已经使用过fileUpload解析过request了,你在Controller里面接收到的request都已经是解 析过的,你再次使用upload进行解析获取到的肯定是空,这个就是问题的所在(大家可以在servlet里面实验,看看第二次解析后能不能获取到数据, 当然是不能的)


    解决方案

    1)删除Spring MVC文件上传配置

    1. <!--   
    2.     <bean id="multipartResolver"  
    3.         class="org.springframework.web.multipart.commons.CommonsMultipartResolver">  
    4.         <property name="defaultEncoding" value="UTF-8" />  
    5.   
    6.         <property name="maxUploadSize" value="2000000000" />  
    7.     </bean>  
    8.      -->  

    在控制器里面自己完成request的解析(当然上面spring MVC提供的两种方法是不能用的,所有上传的地方都需要自己做处理)

    1. public void upload3(HttpServletRequest request) {  
    2.         DiskFileItemFactory factory = new DiskFileItemFactory();  
    3.         ServletFileUpload upload = new ServletFileUpload(factory);  
    4.         try {  
    5.             List<FileItem> list = upload.parseRequest(request);  
    6.             for(FileItem item : list){  
    7.                 if(item.isFormField()){  
    8.                       
    9.                 }else{  
    10.                     //item.write(new File(""));  
    11.                 }  
    12.             }  
    13.         } catch (FileUploadException e) {  
    14.             e.printStackTrace();  
    15.         }  
    16.           
    17.     }  

    2)如果是需要使用的ProgressListener监听器我们可以重写 CommonsMultipartResolver的parseRequest方法

    1. package com.lwp.spring.ext;  
    2.   
    3. import java.util.List;  
    4. import javax.servlet.http.HttpServletRequest;  
    5. import org.apache.commons.fileupload.FileItem;  
    6. import org.apache.commons.fileupload.FileUpload;  
    7. import org.apache.commons.fileupload.FileUploadBase;  
    8. import org.apache.commons.fileupload.FileUploadException;  
    9. import org.apache.commons.fileupload.servlet.ServletFileUpload;  
    10. import org.springframework.web.multipart.MaxUploadSizeExceededException;  
    11. import org.springframework.web.multipart.MultipartException;  
    12. import org.springframework.web.multipart.commons.CommonsMultipartResolver;  
    13. import com.lwp.listener.FileUploadListener;  
    14. public class CommonsMultipartResolverExt extends CommonsMultipartResolver {  
    15.     @Override  
    16.     protected MultipartParsingResult parseRequest(HttpServletRequest request)  
    17.             throws MultipartException {  
    18.         FileUploadListener listener = new FileUploadListener();  
    19.         String encoding = determineEncoding(request);  
    20.         FileUpload fileUpload = prepareFileUpload(encoding);  
    21.         fileUpload.setProgressListener(listener);  
    22.         try {  
    23.             List<FileItem> fileItems = ((ServletFileUpload) fileUpload).parseRequest(request);  
    24.             return parseFileItems(fileItems, encoding);  
    25.         }  
    26.         catch (FileUploadBase.SizeLimitExceededException ex) {  
    27.             throw new MaxUploadSizeExceededException(fileUpload.getSizeMax(), ex);  
    28.         }  
    29.         catch (FileUploadException ex) {  
    30.             throw new MultipartException("Could not parse multipart servlet request", ex);  
    31.         }  
    32.     }  
    33. }  

    监听器方法

    1. import org.apache.commons.fileupload.ProgressListener;  
    2.   
    3. public class FileUploadListener implements ProgressListener {  
    4.   
    5.     @Override  
    6.     public void update(long arg0, long arg1, int arg2) {  
    7.         //arg0 已经上传多少字节  
    8.         //arg1 一共多少字节  
    9.         //arg2 正在上传第几个文件  
    10.         System.out.println(arg0 +" " + arg1 +" " + arg2);  
    11.     }  
    12.       
    13. }  

    配置文件改为我们自己的(这种方式的缺陷是,所有文件上传都需要使用到Listener)

    1. <bean id="multipartResolver"  
    2.         class="com.lwp.spring.ext.CommonsMultipartResolverExt">  
    3.         <property name="defaultEncoding" value="UTF-8" />  
    4.         <property name="maxUploadSize" value="2000000000" />  
    5.     </bean>  


    注: 综上所述,如果只是普通的文件上传spring MVC 完全可以完成,如果需要使用进度条的listener前段可以使用假的进度条或者是上面的两种方式.

  • 相关阅读:
    Fix RICHTX32.OCX Issue on Windows 7
    Solved: c:\windows\system32\config\systemprofile\desktop
    递归的现实应用
    Win 8 app 获取窗口的宽度和高度, 本地化, 及文本读取
    均匀设计U Star 665
    GridView.ScrollIntoView() doesn't work
    XML节点访问与更新
    Keyboard supports in Software Testing
    WordPress程序备受喜爱的原因:十八般武艺
    paypal注册教程(PP注册教程)paypal使用方法
  • 原文地址:https://www.cnblogs.com/xuqiudong/p/5048154.html
Copyright © 2011-2022 走看看