上传文件
请求:必须是POST请求
表单:enctype = "multipart/form-data"
Spring MVC:通过MultipartFile处理上传文件
开发步骤
访问账号设置页面
上传头像
获取头像
具体步骤
1、实现UserService的updateHeader方法
public int updateHeader(int userId, String headerUrl) {
int rows = userMapper.updateHeader(userId, headerUrl);
//Ed2.0
clearCache(userId);
return rows;
}2、在controller中添加对应方法
@LoginRequired
@RequestMapping(value = "/upload", method = RequestMethod.POST)
public String uploadHeader(MultipartFile headerImage, Model model) {
if (headerImage == null) {
model.addAttribute("error", "您还没有选择相片!");
return "/site/setting";
}
String originalFilename = headerImage.getOriginalFilename();
String suffix = originalFilename.substring(originalFilename.lastIndexOf("."));
if (StringUtils.isBlank(suffix)) {
model.addAttribute("error", "文件格式不正确!");
return "/site/setting";
}
//生成随机文件名
String fileName = CommunityUtil.generateUUID() + new Random().nextInt(9999) + suffix;
//确定文件存放的路径
//uploadPath在properties中设置为了本地硬盘,通过@Value取值
File dest = new File(uploadPath + "/" + fileName);
try {
headerImage.transferTo(dest);
} catch (IOException e) {
logger.error("上传文件失败" + e.getMessage());
throw new RuntimeException("上传文件失败,服务器发生异常!", e);
}
//更新当前用户的头像的路径(web访问路径)
//http://localhost:8080/community/user/header/xxx.png
User user = hostHolder.getUser();
String headerUrl = domain + contextPath + "/user/header/" + fileName;
userService.updateHeader(user.getId(), headerUrl);
return "redirect:/index";
}
@RequestMapping(value = "/header/{fileName}", method = RequestMethod.GET)
public void getHeader(@PathVariable("fileName") String fileName, HttpServletResponse response) {
//服务器存放路径
fileName = uploadPath + "/" + fileName;
//文件后缀
String suffix = fileName.substring(fileName.lastIndexOf("."));
//相应图片
response.setContentType("image/" + suffix);
try (FileInputStream fis = new FileInputStream(fileName);
OutputStream os = response.getOutputStream();) {
byte[] buffer = new byte[1024];
int b = 0;
while ((b = fis.read(buffer)) != -1) {
os.write(buffer, 0, b);
}
} catch (IOException e) {
logger.error("读取头像失败:" + e.getMessage());
}
}
@LoginRequired
@RequestMapping(value = "/modify", method = RequestMethod.POST)
public String modifyPassword(String oldPassword, String newPassword, String confimPassword, Model model) {
User user = hostHolder.getUser();
if (StringUtils.isBlank(oldPassword) || StringUtils.isBlank(newPassword) || StringUtils.isBlank(confimPassword)) {
model.addAttribute("oldpasswordError", "密码输入有误,请重新输入!");
model.addAttribute("newpasswordError", "密码输入有误,请重新输入!");
model.addAttribute("confimpasswordError", "密码输入有误,请重新输入!");
return "/site/setting";
}
if (!user.getPassword().equals(CommunityUtil.md5(oldPassword + user.getSalt()))) {
model.addAttribute("oldpasswordError", "原密码输入错误,请重新输入!");
return "/site/setting";
}
if (!newPassword.equals(confimPassword)) {
model.addAttribute("newpasswordError", "两次密码输入不一致!");
model.addAttribute("confimpasswordError", "两次密码输入不一致!");
return "/site/setting";
}
userService.updatePassword(user.getId(), CommunityUtil.md5(newPassword + user.getSalt()));
return "redirect:/index";
}3、前台代码
<!-- 上传头像 -->
<h6 class="text-left text-info border-bottom pb-2">上传头像</h6>
<form class="mt-5" method="post" enctype="multipart/form-data" th:action="@{/user/upload}">
<div class="form-group row mt-4">
<label for="head-image" class="col-sm-2 col-form-label text-right">选择头像:</label>
<div class="col-sm-10">
<div class="custom-file">
<input type="file" th:class="|custom-file-input ${error!=null?'is-invalid':''}|"
id="head-image" name="headerImage" lang="es" required="">
<label class="custom-file-label" for="head-image" data-browse="文件">选择一张图片</label>
<div class="invalid-feedback" th:text="${error}">
A
</div>
</div>
</div>
</div>
<div class="form-group row mt-4">
<div class="col-sm-2"></div>
<div class="col-sm-10 text-center">
<button type="submit" class="btn btn-info text-white form-control">立即上传</button>
</div>
</div>
</form>
京公网安备 11010502036488号