在前一篇文章我们通过强大并且易用的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):
也就是说,我们可以通过一个特定的属性编辑器来讲得到的二进制数据转换成我们希望的数据类型,比如一个文本字符串或者提取其中的某些属性组成一个字符串列表,比如Email通讯录列表。
为了启用我们的PropertyEditor,那么我们就需要了解另外一个东东-WebDataBinder,通过它去调用PropertyEditor,我们可以将请求数据绑定成我们希望的数据对象。
初始化自定义WebDataBinder的方法有两种(详情请参考http://www.redsaga.com/spring_ref/2.5/html/mvc.html#mvc-ann-webdatabinder):
1.使用@InitBinder注解;
2.在配置文件中配置
让我们继续导入通讯录列表的例子,首先让我们准备一个CSV邮件通讯录列表文件contacts.csv:
我们还需要一个类来表示好友邮件信息-Email.class:
接下来我们来准备一个自定义的Property Editor: CustomEmailDataEditor
在这段代码中使用到了一个开源的第三方类库OpenCSV来读取CSV文件,该类库的下载地址是http://opencsv.sourceforge.net/
接下来,我们需要将自定义的Property Editor注册。我们通过在Controller类中@InitBinder注解的方式注册:
接下来让我们来看Controller方法:
OK,到这里我们所有的工作已经准备完成,此处忽略了一些Spring MVC @Controller的配置,详情请参考上一篇文章http://dakulaliu.iteye.com/blog/236235,在Eclipse中启动Tomcat 6.0 Server上传刚才我们创建的contacts.csv
文件,完成之后在控制台打印出上传文件的信息:
好了-搞定-收工!
而在本文中让我们来讨论一下文件上传的另外一种情况,例如一个支持导入你的本地通讯录列表的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注解;
- @Controller
- ublic class MyFormController {
- @InitBinder
- public void initBinder(WebDataBinder binder) {
- SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
- dateFormat.setLenient(false);
- binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, false));
- }
- // ...
2.在配置文件中配置
- <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
- <property name="cacheSeconds" value="0" />
- <property name="webBindingInitializer">
- <bean class="org.springframework.samples.petclinic.web.ClinicBindingInitializer" />
- </property>
- </bean>
让我们继续导入通讯录列表的例子,首先让我们准备一个CSV邮件通讯录列表文件contacts.csv:
- 名,姓,全名,昵称,邮箱地址
- Jacky,Lau,Jacky Lau,,jacky@gmail.com
- Grace,Fox,Grace Fox,,grace@gmail.com
- Tom,Hanks,Tom Hanks,,tom@gmail.com
- Charly,White,Charly White,,charly@gmail.com
我们还需要一个类来表示好友邮件信息-Email.class:
- public class Email {
- private String name;
- private String email;
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public String getEmail() {
- return email;
- }
- public void setEmail(String email) {
- this.email = email;
- }
- }
接下来我们来准备一个自定义的Property Editor: CustomEmailDataEditor
- public class CustomEmailDataEditor extends PropertyEditorSupport {
- public void setValue(Object value) {
- if (value instanceof MultipartFile) {//处理上传文件,此处默认上传的是格式正确的CSV文件
- MultipartFile multipartFile = (MultipartFile) value;
- System.out.println(multipartFile.getContentType());//打印Content-Type
- try {
- //使用第三方开源类库OpenCSV来读取CSV文件
- CSVReader reader = new CSVReader(new InputStreamReader(
- multipartFile.getInputStream()));
- String[] nextLine;
- // 去除第一行header信息
- reader.readNext();
- List<Email> emails = new ArrayList<Email>();
- while ((nextLine = reader.readNext()) != null) {
- Email email = new Email();
- email.setName(nextLine[2]);
- email.setEmail(nextLine[4]);
- emails.add(email);
- }
- //绑定数据列表
- super.setValue(emails);
- } catch (IOException ex) {
- throw new IllegalArgumentException(
- "Cannot read contents of multipart file: "
- + ex.getMessage());
- }
- } else if (value instanceof byte[]) {
- super.setValue(value);
- } else {
- super.setValue(value != null ? value.toString().getBytes() : null);
- }
- }
- }
在这段代码中使用到了一个开源的第三方类库OpenCSV来读取CSV文件,该类库的下载地址是http://opencsv.sourceforge.net/
接下来,我们需要将自定义的Property Editor注册。我们通过在Controller类中@InitBinder注解的方式注册:
- @InitBinder
- public void initBinder(WebDataBinder binder) {
- binder.registerCustomEditor(List.class, new CustomEmailDataEditor());
- }
接下来让我们来看Controller方法:
- @RequestMapping(method = RequestMethod.POST)
- public String handleUploadProcess(BoUploadFile upload, Model model)
- throws Exception {
- System.out.println("Name is " + upload.getName());
- for (Email email : upload.getImageFile()) {
- System.out.println("Name : " + email.getName() + " | email : "
- + email.getEmail());
- }
- model.addAttribute("success", "true");
- return "uploadView";
- }
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
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.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-...
赠送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; 包含...
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...
赠送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;...
commons-fileupload-1.2.1-bin commons-fileupload 文件上传 commons-fileupload-1.2.1-bin commons-fileupload 文件上传 jar包 及相关文档
commons-lang-2.3.jar,在使用组件实现文件上传时候要注意前后台的一致性,注意在后台定义File文件对象名要与jsp页面中的file标签name名字一致,前台form标签属性一定要设置为enctype="multipart/form-data",而且...
java+servlet+commons-io-2.4.jar+commons-fileupload-1.3.jar实现文件的上传与下载
商业编程-源码-Anthem.NET中FileUpload控件Ajax方式的文件上传.zip
commons-fileupload-1.4.jar
commons-fileupload-1.1.1.jar fileupload.jar上传文件 j2ee上传文件 j2ee上传文件jar包
commons-fileupload-1.3.3.jar和commons-io-2.6.jar最新版本
主要为大家详细介绍了使用fileupload实现文件上传功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
commons-fileupload-1.3.2jar包和commons-io-2.5jar包,可以到http://commons.apache.org里面下载最新版本。
antlr-2.7.6rc1.jar(下面的略.jar) asm.jar asm-2.2.3.jar ...spring-webmvc sqljdbc struts velocity-1.5 velocity-tools-1.3 xapool xerces-2.6.2 xml-apis (我做毕业设计时,用到的。需要的话拿去用)
自己写的使用commons-fileupload包上传文件的简单例子。同时用到的包有commons-io
使用FileUpload组件实现上传功能,供大家一起共同分享学习。
使用方法 1、首先在项目下创建一个文件夹,保存我们的jar包。...【Floder】,打开新建文件夹窗口 ...我们通常在lib文件夹中存放从外部引入的jar包 ... 8、此时,在Eclipse中,我们就可以使用这个jar包了。
commons-fileupload-1.0上传组件使用实例.以及使用组件的乱码问题。
commons-fileupload-1.2.1.srccommons-fileupload-1.2.1.srccommons-fileupload-1.2.1.srccommons-fileupload-1.2.1.srccommons-fileupload-1.2.1.src