注意:
-上传文件
--请求必须是POST请求
--表单enctype="multipart/form-data"
--SpringMVC通过MultipartFile处理上传文件
1、配置上传文件资源的存放位置(application.properties)
community.path.upload=D:/Code/Java/community/dataFile/upload
2、HostHolder工具类
/**
* Created by Monologue_zsj Luna on 2020/11/13 18:19
* Description:持有用户的信息,用于代替Session对象
*/
@Component
public class HostHolder {
private ThreadLocal<User> users = new ThreadLocal<>();
public void setUser(User user) {
users.set(user);
}
public User getUser() {
return users.get();
}
public void clear() {
users.remove();
}
}
3、UserService调用更新头像的方法
/**
* 更新头像
* @param userId
* @param headerUrl
* @return
*/
public int updateHeader(int userId, String headerUrl) {
return userMapper.updateHeader(userId, headerUrl);
}
4、Controller处理
/**
* Created by Monologue_zsj Luna on 2020/11/13 17:43
* Description:
*/
@Controller
@RequestMapping("/user")
public class UserController {
private static final Logger logger = LoggerFactory.getLogger(UserController.class);
@Value("${community.path.upload}")
private String uploadPath;
@Value("${community.path.domain}")
private String domain;
@Value("${server.servlet.context-path}")
private String contextParh;
@Autowired
private UserService userService;
@Autowired
private HostHolder hostHolder;
@GetMapping("/setting")
public String getSettingPage() {
return "/site/setting";
}
/**
* 头像上传
* @param headerImage
* @param model
* @return
*/
@PostMapping("/upload")
public String uploadHeader(MultipartFile headerImage, Model model) {
if (headerImage == null) {
model.addAttribute("error", "您还没有选择图片");
return "/site/setting";
}
String filename = headerImage.getOriginalFilename();
//截取文件的后缀名
String suffix = filename.substring(filename.lastIndexOf("."));
if (StringUtils.isBlank(suffix)) {
model.addAttribute("error", "文件的格式不正确");
return "/site/setting";
}
//生成随机的文件名称
filename = CommunityUtil.generateUUID() + suffix;
//确定文件存放的路径
File dest = new File(uploadPath + "/" + filename);
try {
//存储文件
headerImage.transferTo(dest);
} catch (IOException e) {
logger.error("上传文件失败:" + e.getMessage());
throw new RuntimeException("上传文件失败,服务器发生异常", e);
}
//更新当前用户头像的路径(Web访问路径)
//http://localhost:8888/community/user/header/XXX.png
User user = hostHolder.getUser();
String url = domain + contextParh + "/user/header/" + filename;
userService.updateHeader(user.getId(), url);
return "redirect:/index";
}
/**
* 读取头像
* @param filename
* @param response
*/
@GetMapping("/header/{filename}")
public void getHeader(@PathVariable("filename") String filename, HttpServletResponse response) {
//服务器存放路径
filename = uploadPath + "/" + filename;
//文件后缀
String suffix = filename.substring(filename.lastIndexOf("."));
//响应图片
response.setContentType("image/" + suffix);
OutputStream os = null;
FileInputStream fis = null;
try {
os = response.getOutputStream();
fis = new FileInputStream(filename);
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());
}finally {
try {
os.close();
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}