SpringMVC的文件上传和下载
这个部分主要分成三块,文件上传,文件下载,拦截器;
文件上传和下载好理解,但是拦截器的主要功能还是说你在进行登录的时候,假如你还没登录,然后就跳主页的话,就会把你给拦截下来;下面开始文件上传的功能描述;
为了能上传文件,必须将表单里的method设置为POST,并将enctype设置为multipart/form-data;只有在这种情况下,浏览器才会把用户选择的文件二进制数据发送给服务器;
下面是实例;
<html>
<body>
<form action = "upload" enctype = "multipart/form-data" method = "post">
<table>
<tr>
<td>文件描述:</td>
<td><input type = "text" name = "desctiption"></td>
</tr>
<tr>
<td>请选择文件:</td>
<td><input type = "text" name = "file"></td>
</tr>
<tr>
<td><input type = "submit" value = "上传"></td>
</tr>
</table>
</form>
</body>
</html>
然后我们要来一个Controller控制器来接受处理一下文件;
@RequestMapping(value = "/upload",method = RequestMethod.POST)
public String upload(HttpServletRequest request,
@RequestParam("description") String description,
@RequestParam("file") MultipartFile file) throws Exception{
System.out.println(description);
if(!file.isEmpty()){
String path = request.getServletContext().getRealPath("/images");
String filename = file.getOriginalFilename();
File filepath = new File(path,filename);
if(!filepath.getParentFile().exists()){
filepath.getParentFile().mkdirs();
}
file.transferTo(new File(path + File.separator + filename));
return "success";
}else {
return "error";
}
}
而我们知道在SpringMVC上下文中默认没有装配MultipartResolver,因此默认情况下其不能处理文件上传工作,如果想使用Spring的文件上传功能,则需要在上下文中配置MultipartResolver;springmvc-config.xml;
<bean id = "multipartResolver"
class = "org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name = "maxUploadSize">
<value>10485760</value>
</property>
<property name = "defaultEncoding">
<value>UTF-8</value>
</property>
</bean>
需要注意的是,CommonsMultipartResolver必须依赖于Apache CommonsFileUpload的组件,所以需要将Apache的Commons FileUpload的jar包放到项目的类路径下;
另外还有一种上传文件的方式,就是使用接受上传文件,也就是说我们把二进制文件作为一个POJO模型对象来接收上传的文件;
上传文件的jsp页面跟前面一样;在POJO的模型数据时如下;
public class User implements Serializable{
private String username;
private MultipartFile image;
//省略set/get方法;
}
下面是控制器的代码;
@RequestMapping(value = "/register")
public String register(HttpServletReqeust request,
@ModelAttribute User user,
Model model) throws Exception{
System.out.println(user.getUsername());
if(!user.getImage().isEmpty()){
String path = request.getServletContext().getRealPath("/images");
String filename = user.getImage().getOriginalFilename();
File filepath = new File(path,filename);
if(!filepath.getParentFile().exists()){
filepath.getParentFile().mkdirs();
}
user.getImage().transferTo(new File(path + File.separator + filename));
model.addAttribute("user",user);
return "userInfo";
}else {
return "error";
}
}
<h3>文件下载</h3>
<a href = "download?filename = ${requestScope.user.image.originalFilename}">
${requestScope.user.image.originalFilename}</a>
文件下载;代码如下;
@ReqeustMapping(value = "/download")
public ResponseEntity<byte[]> download(HttpServletRequest request,
@RequestParam("filename") String filename,
Model mode){
String path = request.getServletContext().getRealPath("/images");
File file = new File(path + File.separator + filename);
HttpHeaders headers = new HttpHeaders();
String downloadFielName = new String(filename.getBytes("UTF-8"),"iso-8859-1");
headers.setContentDispositionFormData("attachment",downloadFileName);
headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file),headers,HttpStaus.CREATED);
}
Interceptor拦截器也是SpringMVC中相当重要的功能,它的主要作用是拦截用户的请求,并进行相应的处理,比如通过拦截器来进行用户权限验证,或者用来判断用户是否已经登录等;我们需要做的就是先定义一个拦截器,然后通过XML文件配置来把接口设置进去;
public class AuthorizationInterceptor implements HandlerInterceptor{
private static final String[] IGNORE_URI = {"/loginForm","login"};
@Override
public void afterCompletion(HttpServletRequest,
HttpServletResponse response,Object handler,Exception exception) throws Exception{
System.out.println("AuthorizationInterceptor afterCompletion -- >");
}
@Override
public void postHandle(HttpServletRequest request,HttpServletResponse response,
Object handler,ModelAndView mv) throws Exception{
System.out.println("AuthorizationInterceptor postHandle -- >");
}
@Override
public boolean preHandle(HttpServletReqeust,request,HttpServletResponse response,Object handler) throws Exception{
System.out.println("AuthorizationInterceptor proHandle -- >");
boolean flag = false;
String servletPath = request.getServletPath();
for(String s : IGNORE_URI){
if(servletPath.contains(s)){
flag = true;
break;
}
}
if(!flag){
User user = (User) request.getSession().getAttribute("user");
if(user == null){
System.out.println("请求拦截");
request.setAttribute("message","请先登录");
request.getRequestDispatcher("loginForm").forward(request,response)
}else {
System.out.println("AuthorizationInterceptor放形请求");
flag = true;
}
}
return flag;
}
}
在springmvc-config.xml文件中配置拦截器
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path = "/*"/>
<bean class = "org.fkit.interceptor.AuthorizationInterceptor"/>
</mvc:interceptor>
</mvc>
浙公网安备 33010602011771号