问题简述:
解决SpringBoot图片上传需重启服务器才能显示问题
把头像上传到本地路径后,无法立即访问头像,需要重启服务器才可以访问到
这是因为对服务器的保护措施导致的,服务器不能对外部暴露真实的资源路径,需要配置虚拟路径映射访问。
问题解决:
重建本地资源路径
package com.catanddogdiary.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
@Configuration
public class WebConfig extends WebMvcConfigurationSupport {
// @Override
// protected void addResourceHandlers(ResourceHandlerRegistry registry) {
//
// if(!registry.hasMappingForPattern("/static/**")){
// registry.addResourceHandler("/**").addResourceLocations("classpath:/static/");
// registry.addResourceHandler("/static/avatar/**").addResourceLocations("file:G:\\IDEA2023\\CatAndDogDiaryBackEnd\\CatAndDogEnd\\src\\main\\resources\\static\\avatar\\"); /*绝对路径*/
// }
// super.addResourceHandlers(registry);
// }
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/upload/**").addResourceLocations("file:upload/");
}
}
新建一个WebConfig类,实现自定义的资源映射函数addResourceHandlers。
addResourceHandler()里配置需要映射的文件,
addResourceLocations()配置该文件的绝对路径。
@Override
@ApiOperation(value = "根据用户id修改用户头像", notes = "根据用户id修改用户头像")
public Result updateUserAvatarById(List<MultipartFile> files, int userId) {
// 校验头像
if (files.size() > 1) {
return Result.fail("头像只能上传一个!", AVATARFAIL);
}
if (!CheckUtils.isAvatarInvalid(files.get(0).getOriginalFilename())) {
// 无效头像,返回错误信息
return Result.fail("头像格式有误!", AVATARFAIL);
}
// 获取文件名称
String avatar = files.get(0).getOriginalFilename();
// 生成UUID
avatar = UUID.randomUUID().toString().replace("-", "") + avatar.substring(avatar.lastIndexOf("."));
// 将文件保存到本地
if (avatar != null) {
// 生成本地地址,将地址保存到数据库
String avatarUrl = "http://localhost:8080/catanddog/upload/" + avatar;
// 将文件保存到本地地址
try {
// files.get(0).transferTo(new File("G:\\IDEA2023\\CatAndDogDiaryBackEnd\\CatAndDogEnd\\src\\main\\resources\\static\\avatar\\" + avatar));
files.get(0).transferTo(new File("G:\\IDEA2023\\CatAndDogDiaryBackEnd\\CatAndDogEnd\\upload\\" + avatar));
} catch (IOException e) {
throw new RuntimeException(e);
}
// 更新头像
int user = userMapper.updateUserAvatarById(avatarUrl, userId);
// 获取数据库中的头像
String iconUrl = userMapper.selectById(userId).getAvatar();
// 判断用户是否存在
if (user == 0) {
// 用户不存在,返回错误信息
return Result.fail("用户不存在!", USERNAMEFAIL);
}
return Result.success(iconUrl, SUCCESS);
}
return Result.fail("头像只能包含数字、字母、中文!", AVATARFAIL);
}
实现类
结果:
没有重启服务器也可以访问了