Spring Web mvc Maven实现文件上传

来源:互联网 发布:什么是php 编辑:程序博客网 时间:2024/06/06 02:06
昨天写了SpringWeb的Maven 工程搭建,今天来一个有点意思的,Spring mvc 实现文件上传,那么先将配置文件xx-servlet.xml展示一下,配置要对
[html] view plain copy
  1. <!-- 配置文件上传bean -->   
  2.     <beans:bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">  
  3.         <beans:property name="defaultEncoding" value="utf-8"></beans:property>  
  4.         <beans:property name="maxUploadSize" value="10485760000"></beans:property>  
  5.         <beans:property name="maxInMemorySize" value="40960"></beans:property>  
  6.     </beans:bean>  
  7. <!-- Resolves views selected for rendering by @Controllers to .jsp resources in the /WEB-INF/views directory -->  
  8.     <beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">  
  9.         <beans:property name="prefix" value="/WEB-INF/views/" />  
  10.         <beans:property name="suffix" value=".jsp" />  
  11.     </beans:bean>  

第一个就是文件上传的bean配置,里面有默认上传编码,最大可上传文件。第二个昨天没有说,是一个视图解析器,也就是说,昨天写的Controller会返回一个String,那么视图解析器会自动为期加上"prefix"前缀以及“.jsp”后缀,这样就可以找到某个路径下的.jsp文件,就会显示另一个界面。

[html] view plain copy
  1. <form action="upload" method="post" enctype="multipart/form-data">  
  2.     File to upload:<input type="file" name="file"><br/>  
  3.     File to upload:<input type="file" name="file"><br/>    
  4.     <button id="submit1" type="submit" value="submit">提交</button>  
  5. </form>  
这里是jsp中在<body></body>中间加上一个表单form,这里的action是决定提交给哪一个action来解决,这里的method要用post,如果用get,表单数据会以明文形式传输,不安全。这里的enctype一定得写
[html] view plain copy
  1. enctype="multipart/form-data"  
这表明传递的是一个多媒体类型数据,否则会出错,接下来看一下处理文件上传的Controller

[java] view plain copy
  1. @Controller  
  2. public class FileUploadController {  
  3.       
  4.     @RequestMapping("/upload")  
  5.     public String upload(@RequestParam("file")MultipartFile[] files,  
  6.             HttpServletRequest request,ModelMap model){  
  7.         if(files!=null&&files.length>0){  
  8.             for(int i=0;i<files.length;i++){  
  9.                 MultipartFile file = files[i];  
  10.                 //调用储存file的函数  
  11.                 saveFile(request, file);  
  12.                 model.put("name", file.getOriginalFilename());  
  13.             }  
  14.         }  
  15.         return "file";  
  16.     }  
  17.       
  18.     /* 
  19.      * 存储file的函数 
  20.      */  
  21.     private boolean saveFile(HttpServletRequest request, MultipartFile file){  
  22.         if(!file.isEmpty()){  
  23.             try{  
  24.                 String filePath = "F:\\"+"upload\\"+file.getOriginalFilename();  
  25.                 File saveDir = new File(filePath);  
  26.                 if(!saveDir.getParentFile().exists()){  
  27.                     saveDir.getParentFile().mkdirs();  
  28.                 }  
  29.                 //文件转存  
  30.                 file.transferTo(saveDir);  
  31.                 return true;  
  32.             }catch(Exception e){  
  33.                 e.printStackTrace();  
  34.             }  
  35.         }  
  36.         return false;  
  37.     }  
  38. }     
这个代码中,大家看到了@RequestParam,这个注解,可以指定括号内的字符串名,进而可以提取到相应的前台的值,这里在表单里写了两个上传,所以是可以传输多个文件的。所以,如果MultipartFile 的files数组不为空,则对于每一个file执行存储操作

存储函数判断file是否为空,不为空的话,肯定要先指定一个存储路径这里我指定的是F盘下的路径,注意\是转义标识符,所以两个\\才可以表明路径,不懂的同学自行查,后面的操作是建立一个文件夹来存上传文件,之后调用transferTo这个file的转存方法,就可以存好啦,效果很好。

[java] view plain copy
  1. String filePath = "F:"+File.separator+"upload"+File.separator+file.getOriginalFilename();  

这里用了一个File.separator,可以得到文件路径的分隔符,由于Linux和windows下分别为/和\,所以养成良好的习惯,多打几个字也是好的。

ModelMap将文件名存入model中,这样转给前段页面时,前端页面可以直接提取。

上面函数的return "download";就可以让视图解析器自动寻找这个jsp文件

[html] view plain copy
  1. /WEB-INF/views/file.jsp  
看一下这个file.jsp

[html] view plain copy
  1. <body>  
  2.     ${ name}  
  3. </body>  
很简单的一个,就是使用${name}这个EL表达式来提取存在model中的文件名,这里的name是model键值对的key,很好理解,不懂EL表达式的同学可以自行查询
0 0
原创粉丝点击