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拦截了自定义上传的文件,在无法处理的同时也消耗掉了文件传过来的信息,导致在自定义上传的地方获取不到文件信息
解决方法:
- 将springmvc的配置修改掉
<!-- class是自己写的类的地址 -->
<bean id="multipartResolver" class="com.spring.util.MyMultipartResolver">
<!--url中带有import的http请求就不会被multipartResolver先解析-->
<property name="excludeUrls" value="import"/>
</bean>
- 新建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