`
endual
  • 浏览: 3503701 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

简简单单-在Spring MVC中使用FileUpload功能(二)

    博客分类:
  • java
 
阅读更多
在前一篇文章我们通过强大并且易用的Spring MVC中的MultipartResolver简单快速的实现了文件的上传(地址如下:http://dakulaliu.iteye.com/blog/236235)。 

而在本文中让我们来讨论一下文件上传的另外一种情况,例如一个支持导入你的本地通讯录列表的Web Mail系统。那么这个Mail System可能不仅仅希望你上传的通讯录文件作为一个副本保存在服务器端,他还希望更进一步的了解你上传通讯录文件的内容,以便能够将这些内容添加到你的Web Mail通讯录中。好的,我们了解了这样一个需求,就让我们来看看Spring MVC是如何做到的。 

首先,让我们来看一段Spring 2.5 Reference中文版中的话(详情请参考http://www.redsaga.com/spring_ref/2.5/html/mvc.html#mvc-multipart-forms): 
引用
和其它不能自动转为字符串类型或者基本类型(primitive type)的属性一样,为了将上传的二进制数据存成bean的属性,必须通过ServletRequestDatabinder注册一个属性编辑器。 Spring中内置了几个这样的编辑器,它们可以处理文件,然后将结果存成bean的属性。 比如,StringMultipartEditor可以将文件转换成一个字符串(使用用户声明的字符集)。ByteArrayMultipartEditor可以以将文件转换为byte数组。 他们的功能和CustomDateEditor相似。


也就是说,我们可以通过一个特定的属性编辑器来讲得到的二进制数据转换成我们希望的数据类型,比如一个文本字符串或者提取其中的某些属性组成一个字符串列表,比如Email通讯录列表。 

为了启用我们的PropertyEditor,那么我们就需要了解另外一个东东-WebDataBinder,通过它去调用PropertyEditor,我们可以将请求数据绑定成我们希望的数据对象。 

初始化自定义WebDataBinder的方法有两种(详情请参考http://www.redsaga.com/spring_ref/2.5/html/mvc.html#mvc-ann-webdatabinder): 
1.使用@InitBinder注解; 
Java代码  收藏代码
  1. @Controller  
  2. ublic class MyFormController {  
  3.   
  4.    @InitBinder  
  5.    public void initBinder(WebDataBinder binder) {  
  6.        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");  
  7.        dateFormat.setLenient(false);  
  8.        binder.registerCustomEditor(Date.classnew CustomDateEditor(dateFormat, false));  
  9.    }  
  10.   
  11.    // ...  


2.在配置文件中配置 
Java代码  收藏代码
  1. <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">  
  2.     <property name="cacheSeconds" value="0" />  
  3.     <property name="webBindingInitializer">  
  4.         <bean class="org.springframework.samples.petclinic.web.ClinicBindingInitializer" />  
  5.     </property>  
  6. </bean>  


让我们继续导入通讯录列表的例子,首先让我们准备一个CSV邮件通讯录列表文件contacts.csv: 
Java代码  收藏代码
  1. 名,姓,全名,昵称,邮箱地址  
  2. Jacky,Lau,Jacky Lau,,jacky@gmail.com  
  3. Grace,Fox,Grace Fox,,grace@gmail.com  
  4. Tom,Hanks,Tom Hanks,,tom@gmail.com  
  5. Charly,White,Charly White,,charly@gmail.com  


我们还需要一个类来表示好友邮件信息-Email.class: 
Java代码  收藏代码
  1. public class Email {  
  2.     private String name;  
  3.   
  4.     private String email;  
  5.   
  6.     public String getName() {  
  7.         return name;  
  8.     }  
  9.   
  10.     public void setName(String name) {  
  11.         this.name = name;  
  12.     }  
  13.   
  14.     public String getEmail() {  
  15.         return email;  
  16.     }  
  17.   
  18.     public void setEmail(String email) {  
  19.         this.email = email;  
  20.     }  
  21. }  


接下来我们来准备一个自定义的Property Editor: CustomEmailDataEditor 
Java代码  收藏代码
  1. public class CustomEmailDataEditor extends PropertyEditorSupport {  
  2.   
  3.     public void setValue(Object value) {  
  4.         if (value instanceof MultipartFile) {//处理上传文件,此处默认上传的是格式正确的CSV文件  
  5.             MultipartFile multipartFile = (MultipartFile) value;  
  6.             System.out.println(multipartFile.getContentType());//打印Content-Type  
  7.             try {  
  8.                 //使用第三方开源类库OpenCSV来读取CSV文件  
  9.                 CSVReader reader = new CSVReader(new InputStreamReader(  
  10.                         multipartFile.getInputStream()));  
  11.                 String[] nextLine;  
  12.                 // 去除第一行header信息  
  13.                 reader.readNext();  
  14.   
  15.                 List<Email> emails = new ArrayList<Email>();  
  16.                 while ((nextLine = reader.readNext()) != null) {  
  17.                     Email email = new Email();  
  18.                     email.setName(nextLine[2]);  
  19.                     email.setEmail(nextLine[4]);  
  20.                     emails.add(email);  
  21.                 }  
  22.                   
  23.                 //绑定数据列表  
  24.                 super.setValue(emails);  
  25.             } catch (IOException ex) {  
  26.                 throw new IllegalArgumentException(  
  27.                         "Cannot read contents of multipart file: "  
  28.                                 + ex.getMessage());  
  29.             }  
  30.         } else if (value instanceof byte[]) {  
  31.             super.setValue(value);  
  32.         } else {  
  33.             super.setValue(value != null ? value.toString().getBytes() : null);  
  34.         }  
  35.     }  
  36.   
  37. }  


在这段代码中使用到了一个开源的第三方类库OpenCSV来读取CSV文件,该类库的下载地址是http://opencsv.sourceforge.net/ 

接下来,我们需要将自定义的Property Editor注册。我们通过在Controller类中@InitBinder注解的方式注册: 
Java代码  收藏代码
  1. @InitBinder  
  2.     public void initBinder(WebDataBinder binder) {  
  3.         binder.registerCustomEditor(List.classnew CustomEmailDataEditor());  
  4.     }  


接下来让我们来看Controller方法: 
Java代码  收藏代码
  1. @RequestMapping(method = RequestMethod.POST)  
  2. public String handleUploadProcess(BoUploadFile upload, Model model)  
  3.         throws Exception {  
  4.     System.out.println("Name is " + upload.getName());  
  5.     for (Email email : upload.getImageFile()) {  
  6.         System.out.println("Name : " + email.getName() + " | email : "  
  7.                 + email.getEmail());  
  8.     }  
  9.     model.addAttribute("success""true");  
  10.     return "uploadView";  
  11. }  


OK,到这里我们所有的工作已经准备完成,此处忽略了一些Spring MVC @Controller的配置,详情请参考上一篇文章http://dakulaliu.iteye.com/blog/236235,在Eclipse中启动Tomcat 6.0 Server上传刚才我们创建的contacts.csv 
文件,完成之后在控制台打印出上传文件的信息: 
引用
application/vnd.ms-excel 
Name is Contacts List 
Name : Jacky Lau | email : jacky@gmail.com 
Name : Grace Fox | email : grace@gmail.com 
Name : Tom Hanks | email : tom@gmail.com 
Name : Charly White | email : charly@gmail.com


好了-搞定-收工!
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics