当客户端提交了multipart请求后,需要由控制器来接收文件,并保存,最后返回响应的信息。在该项目中的controller包下的UploadsController类承担了这项工作。
UploadsController.java
package com.star.controller; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestPart; import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletRequest; import java.io.File; import java.io.IOException; /** * Created by hp on 2017/2/24. */ @Controller public class UploadsController { @RequestMapping(value = "/") public String index(){ return "index"; } @RequestMapping(value = "/upload",method = RequestMethod.POST) public String upload(@RequestPart("image") MultipartFile image, Model model,HttpServletRequest request) throws IOException { File dir=new File(request.getSession().getServletContext().getRealPath("/uploads")); if(!dir.exists()){//检测文件夹是否存在,若不存在则创建 dir.mkdirs(); } image.transferTo(new File(dir.getAbsolutePath()+"/"+image.getOriginalFilename()));//写入文件 return "success"; } }
在该控制器中有两个方法:
index():该方法返回项目首页,也即表单填写页面。 upload():该方法是处理文件上传请求的控制器方法。@RequestMapping将”/upload”映射到该方法,通过@RequestPart注解来指定接收multipart形式的变量——MultipartFile类型的image。接着,通过MultipartFile类的transferTo()方法将文件写入到文件系统中。在exception包中有一个ExceptionHandler类。该类是一个Spring 异常通知控制器(controller advice)。
ExceptionHandler.java
package com.star.exception; import org.springframework.web.bind.annotation.*; import java.io.IOException; /** * Created by hp on 2017/2/24. */ @ControllerAdvice public class ExceptionHandler { @org.springframework.web.bind.annotation.ExceptionHandler(IOException.class) public String IOException_Handler(){ return "errors/ioError"; } }
@ControllerAdvice注解会将该类中所有添加了@ExceptionHandler注解的类应用到所有控制器中,任何一个控制器的映射方法抛出了IOException都将会由IOException_Handler()方法处理。这大大减少了冗余代码的数量,也使得代码更加整洁也易读。