1.jsp form表单需要加个属性enctype="multipart/form-data",而一旦form表单用了enctype="multipart/form-data"类型后,所有的值 都是以二进制进行传递的,所以当我们想取出这个表单里传递过来的其它变量的时候,就会取不到传递过来的变量。下面具体说下解决方法。
2.pom.xml添加依赖
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
</dependency>
3.过滤器验证
String sessionToken = (String) session.getAttribute("_token");
if (req.getContentType() != null&&req.getContentType().contains("multipart/form-data")) {
CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver();
MultipartHttpServletRequest multipartRequest = multipartResolver.resolveMultipart((HttpServletRequest) req);
String requestToken = multipartRequest.getParameter("_token");
if (StringUtils.isEmpty(requestToken) || StringUtils.isEmpty(sessionToken)) {
httpRes.sendError(404);
return;
}
/**
* 项目要求验证的内容.........
*/
httpReq=multipartRequest;
req=multipartRequest;
chain.doFilter(httpReq, res);
}
4. jsp上传按钮,文件上传按钮自带的样式很丑,而且各个浏览器的还不一致,如果想换一个好看的样式可以自己改下(建议:可以把默认按钮设成透明,然后在默认按钮底层加上自己想要的样式,如果不需要改样式的话,只要红字部分代码就行了)
jsp 代码:
<div class="fbox in-blc">
<input οnchange="fileUpload()" type="file" id="file" name="file" value="" class="file" />
<input id="filebtn" class="filebtn blue" type="button" value="上传" />
</div>
css代码:
#Content input.filebtn{
width: 100px;
padding: 5px 0;
margin: 5px;
float: left;
border: none;
color: #fff;
letter-spacing: 2px;
font-size: 13px;
font-weight: bold;
}
#Content input.filebtn:hover{
cursor: pointer;
transition-property: all ;
transition-duration: 0.3s ;
}
#Content input.file{
height:30px;
line-height:30px;
display:block;
width: 130px;
border: none;
margin-left:-20px;
position: absolute;
letter-spacing: 2px;
font-size: 100px;
font-weight: bold;
z-index: 1;
opacity: 0;
}
#Content input.file:hover{
cursor: pointer;
transition-property: all ;
transition-duration: 0.3s ;
}
.in-blc{
display: inline-block;
margin-top: 10px;
overflow:hidden;
}
5.取得文件地址
CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver();
String path = "";
if (multipartResolver.isMultipart((HttpServletRequest) request)) {
Iterator<String> iter = ((MultipartHttpServletRequest) request).getFileNames();
while (iter.hasNext()) {
MultipartFile f = ((MultipartHttpServletRequest) request).getFile(iter.next());
if (f != null) {
String myFileName = f.getOriginalFilename();
String tempFileName = "tempFile.csv";
if (myFileName != null && myFileName.trim() != "") {
path = "D:\\’" + tempFileName;
File localFile = new File(path);
f.transferTo(localFile);
}
}
}
}
6.处理完临时文件后,记得把临时文件删除。