SpringMVC中实现文件上传

文主要来总结下SpringMVC中实现单个文件上传的步骤。
本节是在上一节的基础上做的

jar包

SpringMVC上传文件的功能需要两个jar包的支持,主要是CommonsMultipartResolver解析器依赖于这两个jar包:
SpringMVC中实现文件上传


前台页面

添加jsp页面:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!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>添加图片</title>
</head>
<body>
	<form action="${pageContext.request.contextPath }/stu/addPic" method="post" enctype="multipart/form-data">
		添加图片:<input type="file" name="picture"/>
		<input type="submit" value="提交"/>
	</form>
</body>
</html>

SpringMVC中实现文件上传
注意:form表单中别忘了写enctype="multipart/form-data"属性。


对多部件类型multipart解析

针对上面的enctype=”multipart/form-data”类型,SpringMVC需要对multipart类型的数据进行解析,在springmvc.xml中配置multipart类型解析器即可:

<!-- 配置多媒体文件解析器 -->
<!-- 文件上传 -->
<bean id="multipartResolver"
    class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    <!-- 设置上传文件的最大尺寸为5MB  5*1024*1024B-->
    <property name="maxUploadSize">
        <value>5242880</value>
    </property>
</bean>

创建文件保存的虚拟目录

在上传文件之前,首先要创建一个虚拟目录来保存文件,这个虚拟目录会对应磁盘上的一个实际的目录,在实际开发中肯定会有一个服务器专门存储资源的,在这里我们就用本地磁盘来保存文件,然后映射一个虚拟目录,用来在程序中指定获取文件的路径。

1)新建文件夹来存储图片

在F盘下新建temp/images来存储图片

2)在tomcat配置文件中配置

在tomcat的conf文件夹中的server.xml中配置:
SpringMVC中实现文件上传

也可以在eclipse中点击tomcat弹出设置,然后在其中创建,这里就不说了


编写Controller

1)跳转到增加图片界面

@RequestMapping("/toAddPic")
public String toAddPic() throws CustomerException{
	return "jsp/add_pic";
}

2)编写保存图片的方法

注意:要避免文件名重复!
考虑实际情况,保存图片时一般不只你一个人保存图片,那么这个图片有的时候文件名可能会重复,你保存多了会把原来的图片给覆盖掉,这就不太合适了,所以需要使用UUID算法为每个文件生成一个新的文件名。
SpringMVC文件上传的类是MultipartFile,参数名称picture必须和前台editItem.jsp页面的name属性一致才行。

@RequestMapping("/addPic")
public String addPic(MultipartFile picture) throws IllegalStateException, IOException{
	// 处理上传的单个图片    
    String originalFileName = picture.getOriginalFilename();// 原始名称
    //上传图片--首先判断有没有文件上传
    if(picture!=null && originalFileName!=null&& originalFileName.length()>0){
    	// 存储图片的物理路径,实际中是要写到配置文件中的,不能在这写死
        String pic_path = "F:\\temp\\images\\";
        //新的图片名称
        String newFileName = UUID.randomUUID()
                + originalFileName.substring(originalFileName
                        .lastIndexOf(".")); 
        File newFile = new File(pic_path + newFileName);//新图片 
        picture.transferTo(newFile);// 将内存中的数据写入磁盘
    }
	return "jsp/student_list";
}

注意:这个案例只是把图片上传到服务器,实际应用中会将图片的地址以string保存到数据库用于使用。
测试即可