@Autowired
private HostHolder hostHolder;
@Autowired
private UserMapper userMapper;
@Value("${community.path.domain}")
private String domain;
@Value("${server.servlet.context-path}")
private String contextPath;
@Value("${community.path.upload}")j`在这里插入代码片`
private String upload;
@PostMapping("/upload")
public String uploadHeader(MultipartFile file, Model model){
if (file == null){
model.addAttribute("error", "您还没有选择图片!");
return "/site/setting";
}
// 获取文件的名字
String filename = file.getOriginalFilename();
// 获取文件的后缀
String suffix = filename.substring(filename.lastIndexOf("."));
if (StringUtils.isBlank(suffix)){
model.addAttribute("error", "文件的格式不正确!");
return "/site/setting";
}
// 重新拼接文件的名称
filename = CommunityUtils.generateUUID()+suffix;
File dest = new File(upload);
if (!dest.exists()){
dest.mkdirs();
}
try {
// 存储文件
file.transferTo(new File(dest, filename));
} catch (IOException e) {
log.error("上传文件失败:[{}]", e.getMessage());
throw new RuntimeException("上传文件失败,服务器发生异常",e);
}
// 更新当前用户的头像路径(web访问路径)
User user = hostHolder.getUser();
// http://localhost:8001/community/user/header/xxx.png
String headerUrl = domain + contextPath + "/user/header/" +filename;
user.setHeaderUrl(headerUrl);
userMapper.updateHeader(user.getId(), headerUrl);
return "redirect:/index";
}
@GetMapping("/header/{filename}")
public void getHeader(@PathVariable("filename") String filename,HttpServletResponse response){
// 服务器存放路径
filename = upload + "/" + filename;
// 获取文件的后缀名
String suffix = filename.substring(filename.lastIndexOf("."));
response.setContentType("image/"+suffix);
try ( ServletOutputStream ops = response.getOutputStream();
FileInputStream fis = new FileInputStream(filename);
)
{
byte[] b = new byte[1024];
int len = 0;
while ((len = fis.read(b))!=-1){
ops.write(b,0, len);
}
} catch (IOException e) {
log.error("读取头像失败", e.getMessage());
}
}
// hostHolder 中的代码 使用ThreadLocal 保存登录的用户
/**
* 持有用户信息,用于代替session对象
*/
@Component
public class HostHolder {
private ThreadLocal<User> threadLocal = new ThreadLocal<>();
public void setUser(User user){
threadLocal.set(user);
}
public User getUser(){
return threadLocal.get();
}
public void clear(){
threadLocal.remove();
}
}
## 二、在webconfigure中配置
```java
@Configuration
@MapperScan("com.yj.fileupload.dao")
public class WebConfig implements WebMvcConfigurer {
@Value("${file.uploadDir}")
private String dir;
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
String p = new File(dir).getAbsolutePath() + File.separator;//取得在服务器中的绝对路径
registry.addResourceHandler("/upload/**").addResourceLocations("file:"+p);
}
}
参考文档添加链接描述