昨天写了SpringWeb的Maven 工程搭建,今天来一个有点意思的,Spring mvc 实现文件上传,那么先将配置文件xx-servlet.xml展示一下,配置要对
<!-- 配置文件上传bean -->
<beans:bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<beans:property name="defaultEncoding" value="utf-8"></beans:property>
<beans:property name="maxUploadSize" value="10485760000"></beans:property>
<beans:property name="maxInMemorySize" value="40960"></beans:property>
</beans:bean>
<!-- Resolves views selected for rendering by @Controllers to .jsp resources in the /WEB-INF/views directory -->
<beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<beans:property name="prefix" value="/WEB-INF/views/" />
<beans:property name="suffix" value=".jsp" />
</beans:bean>
第一个就是文件上传的bean配置,里面有默认上传编码,最大可上传文件。第二个昨天没有说,是一个视图解析器,也就是说,昨天写的Controller会返回一个String,那么视图解析器会自动为期加上"prefix"前缀以及“.jsp”后缀,这样就可以找到某个路径下的.jsp文件,就会显示另一个界面。
<form action="upload" method="post" enctype="multipart/form-data">
File to upload:<input type="file" name="file"><br/>
File to upload:<input type="file" name="file"><br/>
<button id="submit1" type="submit" value="submit">提交</button>
</form>
这里是jsp中在<body>
</body>中间加上一个表单form,这里的action是决定提交给哪一个action来解决,这里的method要用post,如果用get,表单数据会以明文形式传输,不安全。这里的enctype一定得写
enctype="multipart/form-data"
这表明传递的是一个多媒体类型数据,否则会出错,接下来看一下处理文件上传的Controller
@Controller
public class FileUploadController {
@RequestMapping("/upload")
public String upload(@RequestParam("file")MultipartFile[] files,
HttpServletRequest request,ModelMap model){
if(files!=null&&files.length>0){
for(int i=0;i<files.length;i++){
MultipartFile file = files[i];
//调用储存file的函数
saveFile(request, file);
model.put("name", file.getOriginalFilename());
}
}
return "file";
}
/*
* 存储file的函数
*/
private boolean saveFile(HttpServletRequest request, MultipartFile file){
if(!file.isEmpty()){
try{
String filePath = "F:\\"+"upload\\"+file.getOriginalFilename();
File saveDir = new File(filePath);
if(!saveDir.getParentFile().exists()){
saveDir.getParentFile().mkdirs();
}
//文件转存
file.transferTo(saveDir);
return true;
}catch(Exception e){
e.printStackTrace();
}
}
return false;
}
}
这个代码中,大家看到了@RequestParam,这个注解,可以指定括号内的字符串名,进而可以提取到相应的前台的值,这里在表单里写了两个上传,所以是可以传输多个文件的。所以,如果MultipartFile 的files数组不为空,则对于每一个file执行存储操作
存储函数判断file是否为空,不为空的话,肯定要先指定一个存储路径这里我指定的是F盘下的路径,注意\是转义标识符,所以两个\\才可以表明路径,不懂的同学自行查,后面的操作是建立一个文件夹来存上传文件,之后调用transferTo这个file的转存方法,就可以存好啦,效果很好。
String filePath = "F:"+File.separator+"upload"+File.separator+file.getOriginalFilename();
这里用了一个File.separator,可以得到文件路径的分隔符,由于linux和windows下分别为/和\,所以养成良好的习惯,多打几个字也是好的。
ModelMap将文件名存入model中,这样转给前段页面时,前端页面可以直接提取。
上面函数的return "download";就可以让视图解析器自动寻找这个jsp文件
/WEB-INF/views/file.jsp
看一下这个file.jsp
<body>
${ name}
</body>
很简单的一个,就是使用${name}这个EL表达式来提取存在model中的文件名,这里的name是model键值对的key,很好理解,不懂EL表达式的同学可以自行查询