如果我们能够展现用户所上传的图片,那就非常棒了,对吧?为了实现这一点,需要在PictureUploadController 中添加一个模型属性:@ModelAttribute("picturePath")
public Resource picturePath() {
return anonymousPicture;
}
现在,当我们获取上传的图片时,就可以将其注入进来并检索它的值:@RequestMapping(value = "/uploadedPicture")
public void getUploadedPicture(HttpServletResponse response, @ModelAttribute("picturePath") Path picturePath) throws IOException {
response.setHeader("Content-Type", URLConnection.guessContentTypeF romName(picturePath.toString()));
Files.copy(picturePath, response.getOutputStream());
}
@ModelAttribute 是一个非常便利的注解,我们可以通过带有该注解的方法来创建模型属性。通过使用相同的注解,它们就可以注入到控制器方法之中。借助上面的这些代
码,只要不重定向页面,就可以始终在模型中得到picturePath 参数。它的默认值是在属性中所定义的匿名图片。
当文件上传之后,我们需要更新这个值,修改一下onUpload 方法:@RequestMapping(value = "/upload", method = RequestMethod.POST)
public String onUpload(MultipartFile file, RedirectAttributes redirectAttrs, Model model) throws IOException {
if (file.isEmpty() || !isImage(file)) {
redirectAttrs.addFlashAttribute("error", "Incorrect file.Please upload a picture.");
return "redirect:/upload";
}
Resource picturePath = copyFileToPictures(file);
model.addAttribute("picturePath", picturePath);
return "profile/uploadPage";
}
通过将模型注入进来,我们就能在上传完成之后,更新picturePath 参数的值。
现在,问题在于我们的两个方法,即onUpload 和getUploadedPicture 是在不同的请求中调用的。而模型属性在不同的请求间会进行重置。
这样的话,我们就需要将picturePath 参数定义为会话属性,要实现这一点,只需在控制器类上添加另外一个注解即可:
@Controller
@SessionAttributes("picturePath")
public class PictureUploadController {
}
为了处理一个简单的会话属性,我们添加了好几个注解。现在,能够得到如图所示的结果。
这种方式让代码的组合变得非常容易,我们也没有直接使用HttpServletRequest 或HttpSession,另外,我们的对象在编码时输入起来会非常简便。