记录spring上传冲突

springMVC的multipartResolver与自定义的上传冲突

当两种上传方式需要同时存在时就会互斥,如何解决呢?

自定义的上传方法

/**
	 * 自定义上传文件方法
	 * @param request
	 * @param response
	 * @return
	 * @throws Exception
	 */
public String uploadFile(HttpServletRequest request,HttpServletResponse response) throws Exception{
		response.setContentType("multipart/form-data");
		response.setCharacterEncoding("UTF-8");
		String fileName ="";
		ServletContext scontext=request.getSession().getServletContext();
		//获取绝对路径
		String abpath=scontext.getRealPath("")+"excelfiles";

		File file = new File(abpath);
		if (!file.exists()) {
			file.mkdirs();
		}

		DiskFileItemFactory factory = new DiskFileItemFactory();
		factory.setRepository(file);
		ServletFileUpload upload = new ServletFileUpload(factory);
		upload.setHeaderEncoding("UTF-8");
		upload.setFileSizeMax(1024 * 1024 * 1000);
		upload.setSizeMax(1024 * 1024 * 5000);
		try {
			//当两种方式同时存在时这个list将为“[]”
			List list = upload.parseRequest(request);
			Iterator itr = list.iterator();
			while (itr.hasNext()) {
				FileItem item = (FileItem) itr.next();
				if (item.isFormField()) {

				} else {
					fileName = item.getName();
					if (fileName == null || fileName.trim().length() == 0) {
						continue;
					}

					// 注意:不同的浏览器提交的文件名是不一样的,有些浏览器提交上来的文件名是带有路径的
					// 如: C:\Users\H__D\Desktop\1.txt 而有些则是 : 1.txt
					// 处理获取到的上传文件的文件名的路径部分,只保留文件名部分
					fileName = fileName.substring(fileName.lastIndexOf("\\") + 1);
			
					// 得到上传文件的扩展名
					String fileExt = fileName.substring(fileName.lastIndexOf(".") + 1).toLowerCase();
					// 检查扩展名
					// 如果需要限制上传的文件类型,那么可以通过文件的扩展名来判断上传的文件类型是否合法
					if (!"xls,xlsx".contains(fileExt)) {
						System.out.println("上传文件扩展名是不允许的扩展名:" + fileExt);
						break;
					}
					InputStream is = item.getInputStream();
					if (item.getSize() == 0) {
						continue;
					}
					if (item.getSize() > 1024 * 1024 * 1) {
						System.out.println("上传文件大小:" + item.getSize());
						break;
					}
					FileOutputStream out = new FileOutputStream(file+"/"+fileName);
					byte[] buffer = new byte[1024];
					int len=0;
					while((len=is.read(buffer))>0){
						out.write(buffer, 0, len);
					}
					is.close();
					out.close();
					item.delete();
				}
			}
		} catch (FileUploadException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		String path = file+"\\"+fileName;
		path = path.replace("\\", "/");
		return path;
	}

SpringMVC的MultipartResolver配置

<!-- 设置文件上传大小 1G-->
	<!-- <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">  
	    <property name="maxUploadSize" value="1073741824"/> 
	</bean> -->

原因:

MultipartResolver拦截了自定义上传的文件,在无法处理的同时也消耗掉了文件传过来的信息,导致在自定义上传的地方获取不到文件信息

解决方法:

  1. 将springmvc的配置修改掉
<!--  class是自己写的类的地址 -->
<bean id="multipartResolver" class="com.spring.util.MyMultipartResolver">
	<!--url中带有import的http请求就不会被multipartResolver先解析-->
	<property name="excludeUrls" value="import"/>
</bean>
  1. 新建MyMultipartResolver类,继承CommonsMultipartResolver
package com.spring.util;

import javax.servlet.http.HttpServletRequest;

import org.springframework.web.multipart.commons.CommonsMultipartResolver;

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) {
            // 这里可以自己换判断
        	System.out.println(request.getRequestURI());
            if (request.getRequestURI().contains(url)) {
                return false;
            }
        }
        return super.isMultipart(request);
    }
     
}

如此,问题便解决了

此篇文章参考自https://blog.csdn.net/tianya3530/article/details/53788864

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值