完美处理SpringMVC文件上传的一系列问题(无法获取参数、断点、分片等)

问题1 使用@RequestParam或者用request.getParameter无法获取参数的问题

这个问题就是由于multipart/form-data这种上传方式引起的问题,会造成二进制数据

如何解决

resolver1:愚蠢的方法

在表单提交的form的action后面直接附加?param=param的形式,简单粗暴,但是某些业务场景不允许这么做

tips:onSubmit="return validate();"是表单提交前的回调方法

resolver2:繁琐的方法

修改成自定义的mutipartResolver

	
		
		
		
		
public class MyMultipartResolver extends CommonsMultipartResolver {
    private String excludeUrls;   
    private String[] excludeUrlArray;
    
    public String getExcludeUrls() {
        return excludeUrls;
    }




    public void setExcludeUrls(String excludeUrls) {
        this.excludeUrls = excludeUrls;
        this.excludeUrlArray = excludeUrls.split(",");
    }




    /**
     * 这里是处理Multipart http的方法。如果这个返回值为true,那么Multipart http body就会MyMultipartResolver 消耗掉.如果这里返回false
     * 那么就会交给后面的自己写的处理函数处理例如刚才ServletFileUpload 所在的函数
     * @see org.springframework.web.multipart.commons.CommonsMultipartResolver#isMultipart(javax.servlet.http.HttpServletRequest)
     */
    @Override
    public boolean isMultipart(HttpServletRequest request) {
        for (String url: excludeUrlArray) {
            // 这里可以自己换判断
            if (request.getRequestURI().contains(url)) {
                return false;
            }
        }
        
        return super.isMultipart(request);
    }
     
}
		//如果是Multipart上传则是文件信息
		if (ServletFileUpload.isMultipartContent(request)){
			try {
				DiskFileItemFactory factory = new DiskFileItemFactory();
				factory.setSizeThreshold(1024);
				ServletFileUpload upload = new ServletFileUpload(factory);
				upload.setHeaderEncoding("UTF-8");
				List items = upload.parseRequest(request);
				for(FileItem item : items){
					//item文本域
					if(item.isFormField()){
						if(item.getFieldName().equals("name")){
							fileName =  new String(item.get(),"UTF-8");
						}else if(item.getFieldName().equals("chunk")){
使用fileupload中的方法,防止被mutipartResolver过滤,直接判断文件域和文本域

比较繁琐

resovler3:看代码

			ShiroHttpServletRequest shiroRequest = (ShiroHttpServletRequest) request;
			CommonsMultipartResolver commonsMultipartResolver = new CommonsMultipartResolver();
			MultipartHttpServletRequest multipartRequest = commonsMultipartResolver
					.resolveMultipart((HttpServletRequest) shiroRequest
							.getRequest()); 
			String aa = multipartRequest.getParameter("aa");
这里集成了shiro所以要这么处理下下

有意思吧,只要按照任意一种处理方式,都可以完美解决此问题



你可能感兴趣的:(springmvc)