昨天写了SpringWeb的Maven 工程搭建,今天来一个有点意思的,Spring mvc 实现文件上传,那么先将配置文件xx-servlet.xml展示一下,配置要对
-
- <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>
-
- <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];
-
- saveFile(request, file);
- model.put("name", file.getOriginalFilename());
- }
- }
- return "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文件
看一下这个file.jsp
很简单的一个,就是使用${name}这个EL表达式来提取存在model中的文件名,这里的name是model键值对的key,很好理解,不懂EL表达式的同学可以自行查询