`
endual
  • 浏览: 3559090 次
  • 性别: 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


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

相关推荐

    开发工具 commons-fileupload-1.3.2

    开发工具 commons-fileupload-1.3.2开发工具 commons-fileupload-1.3.2开发工具 commons-fileupload-1.3.2开发工具 commons-fileupload-1.3.2开发工具 commons-fileupload-1.3.2开发工具 commons-fileupload-1.3.2...

    commons-fileupload-1.2.2

    commons-fileupload-1.2.2commons-fileupload-1.2.2commons-fileupload-1.2.2commons-fileupload-1.2.2commons-fileupload-1.2.2commons-fileupload-1.2.2commons-fileupload-1.2.2commons-fileupload-1.2.2commons-...

    commons-fileupload-1.3.3&commons-fileupload-1.3.3架包和代码.rar

    标题中的"commons-fileupload-1.3.3&commons-fileupload-1.3.3架包和代码.rar"提到了Apache Commons FileUpload的1.3.3版本的库及其源码。Apache Commons FileUpload是一个Java库,专门用于处理HTTP协议中的多部分...

    commons commons-fileupload历史版本jar包集合

    commons-fileupload-1.0.zip commons-fileupload-1.1.1.zip commons-fileupload-1.1.zip commons-fileupload-1.2.1-bin.zip commons-fileupload-1.3.1-bin.zip commons-fileupload-1.3.1-src.zip commons-fileupload...

    Spring MVC所需jar包

    在 Spring MVC 的开发中,需要用到一系列的 jar 包来支持其功能。这些 jar 包通常包括以下几个核心部分: 1. **Spring 框架核心库**:这是 Spring MVC 的基础,它包含了 IoC(Inversion of Control,控制反转)和 ...

    8-Spring-mvc-文件上传1

    在Spring MVC框架中,文件上传是一项常见的功能,它允许用户通过Web表单上传文件到服务器。Spring MVC通过集成Apache Commons FileUpload库实现了这一功能。在本文中,我们将深入探讨如何配置和使用Spring MVC进行...

    commons-fileupload-1.4-API文档-中文版.zip

    赠送jar包:commons-fileupload-1.4.jar; 赠送原API文档:commons-fileupload-1.4-javadoc.jar; 赠送源代码:commons-fileupload-1.4-sources.jar; 赠送Maven依赖信息文件:commons-fileupload-1.4.pom; 包含...

    Spring MVC 文件上传下载 后端 - Java.zip

    在Spring MVC框架中,文件上传和下载是常见的功能需求,特别是在构建Web应用程序时。这个压缩包文件"Spring MVC 文件上传下载 后端 - Java.zip"包含的文档可能详细阐述了如何在Java后端实现这些功能。以下是关于...

    commons-fileupload-1.3.3-API文档-中文版.zip

    赠送jar包:commons-fileupload-1.3.3.jar; 赠送原API文档:commons-fileupload-1.3.3-javadoc.jar; 赠送源代码:commons-fileupload-1.3.3-sources.jar; 赠送Maven依赖信息文件:commons-fileupload-1.3.3.pom;...

    Spring Mvc 应用Jar包

    - 压缩包中可能包含了`commons-fileupload.jar`和`commons-io.jar`:这两个Apache Commons库提供了处理HTTP请求中文件上传的功能,Spring MVC通过它们来支持文件上传操作。 4. **日志库** - 虽然提到无需导入...

    commons-fileupload-1.3.3.jar和commons-io-2.6.jar

    在Java开发中,上传文件是一项常见的任务,而`commons-fileupload-1.3.3.jar`和`commons-io-2.6.jar`是Apache Commons项目中的两个重要库,专门用于处理HTTP请求中的文件上传功能。这两个库为开发者提供了便捷、高效...

    spring mvc框架需要用到的jar包

    以下将详细阐述这些关键jar包的作用及其在Spring MVC中的重要性。 1. **spring-webmvc.jar**:这是Spring MVC的核心库,包含了处理HTTP请求、控制器注解、视图解析等核心功能。它提供了一个DispatcherServlet,它是...

    Spring MVC 4.2.4.RELEASE 中文文档

    关于主题的概览、定义主题和主题解析器部分则是讨论了如何在 Spring MVC 中定义和使用主题来动态更改应用的外观。Web 容器错误页面的定制化允许开发者自定义服务器错误页面,以提供更友好的用户体验。 从约定优于...

    commons-fileupload commons-fileupload-1.2.1-bin

    commons-fileupload-1.2.1-bin commons-fileupload 文件上传 commons-fileupload-1.2.1-bin commons-fileupload 文件上传 jar包 及相关文档

    commons-fileupload-1.3.2.jar

    - Spring MVC: 在Spring MVC应用中,可以与`CommonsMultipartResolver`结合,自动处理文件上传。 - Struts 2: 对于基于Struts 2的应用,可以通过配置`struts.multipart.parser`属性为`jakarta`来启用Apache ...

    commons-fileupload-1.4-bin.zip

    标题中的"commons-fileupload-1.4-bin.zip"表明这是一个包含Apache Commons FileUpload 1.4版本的二进制文件包,而描述中的"fileupload-1.4"进一步确认了这个版本号。 Apache Commons FileUpload的主要功能在于解析...

    Expert Spring MVC

    #### 二、Spring MVC 的核心组件 Spring MVC 有几个关键组件,它们协同工作以支持应用程序的功能: 1. **DispatcherServlet**:这是 Spring MVC 的前端控制器,它接收 HTTP 请求并将请求分发到适当的处理程序。 -...

    关于Spring MVC项目(maven)中通过fileupload上传文件

    在本场景中,我们关注的是使用Maven构建的Spring MVC项目,并涉及到`commons-fileupload`和`commons-io`这两个库,它们是Java中处理文件上传的核心工具。以下是关于这个主题的详细知识点: 1. **Spring MVC**: ...

    Spring mvc工程所需jar包资源

    在Spring MVC中,通常会将DispatcherServlet配置在Web应用的上下文中。 4. **Spring AOP**: 支持面向切面编程,可以方便地实现日志记录、事务管理等功能。 5. **Spring JDBC**: 提供了与数据库交互的抽象层,简化...

    commons-fileupload-1.3.3-bin.tar.gz

    标题中的"commons-fileupload-1.3.3-bin.tar.gz"是一个压缩包文件,包含了Apache Commons FileUpload 1.3.3版本的二进制(bin)文件,通常包括JAR库和其他必要的资源。 Apache Commons FileUpload的工作原理是基于...

Global site tag (gtag.js) - Google Analytics