创建Maven Project,Group Id值为cn.tedu.spring,Artifact Id为SPRINGMVC-UPLOAD,在配置依赖时,此次需要spring-webmvc依赖,另外,还需要commons-fileupload依赖:
添加依赖
<dependencies>
<!-- spring-webmvc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.3.9.RELEASE</version>
</dependency>
<!-- 文件上传 -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.4</version>
</dependency>
</dependencies>
添加SpringMVC的配置文件
添加web.xml的配置文件
<servlet>
<servlet-name>SpringMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:a.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>SpringMVC</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
设计界面
在webapp下创建index.html,作为用户选择文件上传的界面,该界面中,上传控件必须是,控件所在的表单必须使用POST方式提交请求,且必须配置enctype=“multipart/form-data”,其它部分可以自行设计,例如:
基于SpringMVC的文件上传
请选择您要上传的文件
# 配置MultipartResolver 在Spring的配置文件中添加:控制器中填写处理的方法
@RequestMapping(“upload.do”)
public String handleUpload(@RequestParam(“file”) MultipartFile file,HttpServletRequest request) {
// 确定上传的文件夹
String dirPath = request.getServletContext().getRealPath(“upload”);
File dir = new File(dirPath);
if (!dir.exists()) {
dir.mkdirs();
}
//确定上传的文件名
String originalFilename = file.getOriginalFilename();
String suffix = “”;
int beginIndex = originalFilename.lastIndexOf(".");
if (beginIndex != -1) {
suffix = originalFilename.substring(beginIndex);
}
String filename = UUID.randomUUID().toString() + suffix;
// 确定上传到服务器,保存到的目标文件
File dest = new File(dir,filename);
System.out.println(file);
// 执行保存
try {
file.transferTo(dest);
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
MultipartFile相关API
boolean isEmpty()
该方法用于判断上传的文件是否为空,当用户没有选择需要上传的文件,或选中的文件是空文件(0字节)时,该方法返回true,可用于验证:
boolean isEmpty = file.isEmpty();
System.out.println(“isEmpty=” + isEmpty);
if (isEmpty) {
return “error”;
}
long getSize()
该方法用于获取文件的大小,以字节为单位,通常,用于限制上传的文件大小:
long size = file.getSize();
System.out.println(“size=” + size);
if (size > 2 * 1024 * 1024) {
return “error”;
}
String getContentType()
该方法用于获取文件的MIME类型,通常,用于限制上传的文件的类型:
String contentType = file.getContentType();
System.out.println(“contentType=” + contentType);
List types = new ArrayList();
types.add(“image/jpeg”);
types.add(“image/png”);
types.add(“image/gif”);
if (!types.contains(contentType)) {
return “error”;
}
关于各种文件扩展名对应的MIME类型,可以上网查阅,也可以在Tomcat目录中的conf/web.xml文件中查找。
MIME的值,完全取决于文件的扩展名,如果文件的扩展名被修改,MIME也可能发生变化。
String getOriginalFilename()
获取文件的原名,即该文件在客户端的文件全名,典型的用途就是获取文件的扩展名。
. void transferTo(File dest)
执行保存所上传的文件。
. InputStream getInputStream()
获取输入字节流,用于自定义接收所上传的文件的数据。
注意:该方法与以上transferTo()不可以同时使用,对于每个请求,只能选取其中1个方法来获取数据并保存文件。
关于MultipartResolver的配置
. maxUploadSize
用于配置上传的文件的最大大小,例如:当设置值为5M时,则上传的文件均不可以超过5M,即使一次性上传10个文件,则10个文件的大小总和不允许超过5M。
设置方式例如:
. maxUploadSizePerFile
用于配置上传的每个文件的最大大小,例如:当设置值为5M时,如果一次性上传10个文件,则每个文件都不允许超过5M,但是总大小可以接近50M。
defaultEncoding
用于配置默认编码,上传的文件本身是不考虑编码问题的,只要文件的内容(表示文件内容信息含义的二进制序列)是正确的就可以了!由于上传过程中,会通过CommonsMultipartResolver去组织上传时表单中的数据,表单中可能包括例如输入框等控件,则同一个表单中还可能提交例如用户名等文本信息,这些信息都需要使用正确的编码来进行传递!