通过Maven建立Spring MVC项目,引入了Spring相关jar依赖。

1、为了使用commons fileupload组件,需要在pom.xml中添加依赖;

  <properties>
<spring.version>3.0.7.RELEASE </spring.version>
<junit.version>3.8.1</junit.version>
<fileupload.version>1.2.2</fileupload.version>
</properties>
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>${fileupload.version}</version>
</dependency>

2、配置Spring MVC,项目成功启动后,编写jsp页面;

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Errors导入Excel</title>
</head>
<body>
<div>
<!--只有将表单的enctype设置为multipart/form-data,才能实现文件上传;表单enctype的默认值为:application/x-www-form-urlencoded-->
<!--只有POST方法才会被解析为文件上传请求 -->
<form action="./fileupload" method="post" enctype="multipart/form-data">
<!-- 不知道为啥,type="file"这一标签必须同时添加name属性,否则在处理上传时,无法检测到上传文件 -->
<input type="file" name="fileField"/>
<input type="submit" value="上传"/>
</form>
<p><font color="red">上传文件大小限制在1M之内</font></p>
</div>
</body>
</html>

注:注释当中的内容还是很重要的,使用时遇到了比较多奇葩的问题,暂时还未弄明白原因,留待日后解决。
注:实现上传文件的表单,需要指定method="post"且enctype="multipart/form-data",否则无法通过fileupload组件解析为上传请求。

3、编写Controller,名为FileUploadController,在Controller中对上传文件进行处理;

 @Controller
public class FileUploadController { @RequestMapping("/fileupload")
public String handleFileUpload(HttpServletRequest request){
boolean flag = false; //判断是否是文件上传请求
if(ServletFileUpload.isMultipartContent(request)){
// 创建文件上传处理器
ServletFileUpload upload = new ServletFileUpload();
//限制单个上传文件的大小
upload.setFileSizeMax(1L<<24); try {
// 解析请求
FileItemIterator iter = upload.getItemIterator(request); while (iter.hasNext()) {
FileItemStream item = iter.next(); if (!item.isFormField()) {
//是文件上传对象,获取上传文件的输入流
InputStream srcinInputStream = item.openStream();
/*对上传文件的输入流进行处理,跟本地的文件流处理方式相同*/ }
}
} catch (FileUploadException e) {
System.out.println("上传文件过大");
} catch (IOException e) {
System.out.println("文件读取出现问题");
}
} return flag? "success":"error";
}
}

注:commons fileupload的用户指南 http://commons.apache.org/proper/commons-fileupload/using.html;
注:判断上传请求及处理使用了Streaming API http://commons.apache.org/proper/commons-fileupload/streaming.html;
内容如下:

注:第一次看commons fileupload组件的用户指南时,感觉无从下手,其实User Guide的Parsing the request部分已经给出了很明确的说明。可以通过在对应的请求处理方法中直接通过ServletFileUpload.isMultipartContent(request)来判断是否是文件上传请求,通过 !item.isFormField() 来判断是否是文件上传对象;

4、fileupload组件上传文件时,获取普通域参数值和文件域输入流;
html元素的form表单的enctype属性规定在发送到服务器之前应该如何对表单数据进行编码。表单的enctype默认值为 "application/x-www-form-urlencoded",在表单发送到服务器之前,所有字符都会进行编码(空格转换为 "+" 加号,特殊符号转换为 ASCII HEX 值);对于文件上传,form表单的enctype="multipart/form-data",此时form表单不对字符编码,此时在请求的处理函数中无法通过request.getParameter("parameterName")来获取参数值;

但是可以通过其他方式来获取参数值;

   /**
* 获取页面传递的参数,以Map存储,以fieldName为键值,普通域存储value,文件上传域存储文件输入流
* @param request
* @return
*/
private Map<String, Object> getParameters(HttpServletRequest request){
Map<String, Object> parameters = new HashMap<String, Object>(); // 默认最多允许存储1024个字节
DiskFileItemFactory factory = new DiskFileItemFactory(); if(ServletFileUpload.isMultipartContent(request)){
ServletFileUpload upload = new ServletFileUpload(factory); try{
List<FileItem> items =upload.parseRequest(request); for(Iterator<FileItem> iter = items.iterator(); iter.hasNext();){
FileItem item = iter.next(); if(item.isFormField()){
//普通域,取参数值
parameters.put(item.getFieldName(), item.getString());
}else{
//文件上传域,取输入流
parameters.put(item.getFieldName(), item.getInputStream());
}
}
}catch(Exception exception){
exception.printStackTrace();
}
} return parameters;
}

Spring MVC使用commons fileupload实现文件上传功能的更多相关文章

  1. Apache Commons fileUpload实现文件上传之一

      需要两个jar包: commons-fileupload.jar Commons IO的jar包(本文使用commons-io-2.4.jar) 利用Servlet来实现文件上传. package ...

  2. Apache Commons FileUpload 实现文件上传

    Commons FileUpload简介 Apache Commons是一个专注于可重用Java组件开发的 Apache 项目.Apache Commons项目由三个部分组成: 1.Commons P ...

  3. 完成FileUpload的文件上传功能,且可改按钮样式

    FileUpload控件: 更改按钮样式思路: 自己定义一个按钮,设置该按钮的样式,然后将FileUpload控件通过定位定在自己定义的按钮上面,设置z-index,使得控件浮在自己定义的按钮上面,记 ...

  4. Apache Commons FileUpload实现文件上传

    一.Apache Commons-FileUpload简介 Apache Commons是一个专注于可重用Java组件的所有方面的 Apache 项目. Apache Commons项目由三个部分组成 ...

  5. spring mvc 3.0 实现文件上传功能

    http://club.jledu.gov.cn/?uid-5282-action-viewspace-itemid-188672 —————————————————————————————————— ...

  6. Spring +SpringMVC 实现文件上传功能。。。

    要实现Spring +SpringMVC  实现文件上传功能. 第一步:下载 第二步: 新建一个web项目导入Spring 和SpringMVC的jar包(在MyEclipse里有自动生成spring ...

  7. MVC&WebForm对照学习:文件上传(以图片为例)

    原文  http://www.tuicool.com/articles/myM7fe 主题 HTMLMVC模式Asp.net 博客园::首页::  ::  ::  ::管理 5 Posts :: 0 ...

  8. 刚刚做了个文件上传功能,拿来分享一下!(MVC架构及传统架构通用)

    文件上传无论在软件还是在网站上都十分常见,我今天再把它拿出来,讲一下,主要讲一下它的设计思想和实现技术,为了它的通用性,我把它做在了WEB.Service项目里,即它是针对服务器的,它的结构是关联UI ...

  9. Spring 文件上传功能

    本篇文章,我们要来做一个Spring的文件上传功能: 1. 创建一个Maven的web工程,然后配置pom.xml文件,增加依赖: <dependency> <groupId> ...

随机推荐

  1. MySQL之事务处理、存储过程

    事务处理 动作 开始事务:start transaction 提交事务:commit 回滚事务:rollback 设置自动提交:set autocommit 1 | 0 autoCommit系统默认是 ...

  2. 用js实现简单排序算法

    一.冒泡排序 var arr1=[3,9,2,7,0,8,4]; for(var i=0;i<arr1.length;i++){ for(var j=i+1;j<arr1.length;j ...

  3. C# 3.0 LINQ to XML

    高级转换: static IEnumerable<XElement> ExpandPaths (IEnumerable<string> paths) { var brokenU ...

  4. Android开发之BroadcastReceiver

    BroadcastReceiver:广播接收者.用来接收系统或应用中的广播. 在Android系统中,广播体现在方方面面,例如当开机完成后系统会产生一条广播,接收到这条广播就能实现开机启动服务的功能: ...

  5. linux配置学习笔记(一):如何提高ssh连接的速度

    服务器端sshd配置文件 /etc/ssh/sshd_config 看是否有如下的两条配置条目 GSSAPIAuthentication no UseDNS no 如果前面带#,请把#删掉,或者新添加 ...

  6. 20个linux命令行工具监视性能(上)

    对于每一个系统管理员或网络管理员每天监视或调试linux系统的性能问题是一件非常困难的事,在it行业作为一个linux管理员五年之后,我开始知道监视和保持系统启动和运行有多么的困难.由于这个原因,我们 ...

  7. 经历:Java中字符串中按照多个字符拆分或替换:split()和replaceAll()

    一.replaceAll() 今天,遇到了这样的一个字符串[如下代码]: String s="@0|新港@0|天津@0|东莞@0|南沙@0|营口@0|钦州@0|上海@0|汕头@0|连云港@0 ...

  8. (转)安装程序发布利器——InstallShield 2011 Limited Edition

    最近经常写WCF服务和Windows服务,之前知道可以通过vs2010自带的“安装项目”可以发布程序,但是自vs2010起,同时提供了InstallShield LE. 下面我们通过图示,来了解Ins ...

  9. 重新安装Ubuntu12.04

    重新安装Ubuntu12.04 之所以我重新安装Ubuntu,因为我第一次给根目录分配的空间过小,好像是20GB吧~结果编译Android的时候,编译了3个小时候直接中止掉了.郁闷.这个也告诉我们一定 ...

  10. Sublime Text 3 代码格式化插件推荐 CodeFormatter

    CodeFormatter CodeFormatter has support for the following languages: * PHP - By PHP_Beautifier* Java ...