一、上传文件架包
上传文件需要添加两个架包:
二、上传文件解析器:
DispatcherServlet本身并不知道如何处理multipart的表单数据。这里需要一个multipart解析器把POST请求的multipart数据中抽取出来,这样
DispatcherServlet就能将其传递给我们的控制器。
在spring_mvc.xml配置上传文件解析器:
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="defaultEncoding" value="UTF-8"/>
<property name="maxUploadSize" value="1048576"></property>
</bean>
注意,multipart解析器的bean ID是有意义的。当DispatcherServlet查找multipart解析器的时候,它将会查找ID为multipart的解析器bean,如
果multipart解析器是其他ID的话,DispatcherServlet将会忽略它。
三、添加文件上传域
大多数的表单域都是文本数据,所以能够很容易地通过名称-值提交到服务器中。事实上,典型的提交还会带有一个application/x-www-
form-urlencoded这样的内容类型并将表单上的名字-值以&符合分隔。
但文件上传的内容一般都是二进制的文件,不适合这种名字-值的格式。这里选择的内容类型是multipart/from-data。其jsp代码:
<body>
<form action="/springMVC/springController/upload"
enctype="multipart/form-data"
method="post">
选择文件<input type="file" name="file"><br>
<input type="submit" value="提交">
</form>
</body>
注意:这里的提交方式必须是post,否则会出错
四、保存文件
在springController中添加upload()方法:
@RequestMapping(value="/upload")
public String upload(HttpServletRequest request, HttpServletResponse response) {
CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(request.getSession().getServletContext());
if(multipartResolver.isMultipart(request)){
MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
Iterator<String> iter = multipartRequest.getFileNames();
while(iter.hasNext()){
MultipartFile file = multipartRequest.getFile((String)iter.next());
String fileName =file.getOriginalFilename();
String path ="D:/"+fileName;
File localFile = new File(path);
try {
file.transferTo(localFile);
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return"/helloWorld";
}
CommonsMultipartResolver是一个解析器,这里new一个解析器解析request的内容。multipartResolver.isMultipart(request)是判断request的内容
是否有multipart类型。MultipartHttpServletRequest是spring自带的用于解析文件的request。multipartRequest.getFileNames()是拿取request的所
有文件名,然后通过迭代器得到相应的文件,MultipartFile就是定义拿到的对应的上传文件。接着定义一个文件目录用于指定保存上传
文件的位置。file.transferTo(localFile)就是将上传文件保存到指定的目录。