1. 在配置文件中指定外部环境, 注入到代码中

头像上传路径, 若不存在, 会根据该路径创建指定路径文件夹

upload:path: D:\\upload\headImgs

创建类 FileUtils 并读取配置文件中的值

@Component
@ConfigurationProperties(prefix = "upload")
@Data
public class FileUtils {private String path;public File getPath() {// 构建上传文件的存放 "文件夹" 路径String fileDirPath = new String(path);File fileDir = new File(fileDirPath);if (!fileDir.exists()) {// 递归生成文件夹fileDir.mkdirs();}return fileDir;}public boolean del(String filename) {File file = new File(path + File.separator + filename);return file.delete();}public boolean del(String path, String filename) {return new File(path + File.separator + filename).delete();}
}

2. 设置上传文件的限制配置

spring:servlet:multipart:max-request-size: 10MB # 上传文件的最大值max-file-size: 5MB # 单个文件上传的最大值

3. 设置外部路径映射到url

创建config类
注意: 映射路径时, 最后面一定要加 / (File.separator)

@Configuration
public class WebMvcConfig extends WebMvcConfigurationSupport {@Autowiredprivate FileUtils fileUtils;@Overridepublic void addResourceHandlers(ResourceHandlerRegistry registry) {// 加入头像文件夹映射 可通过 localhost:7188/headimage/....   访问到指定位置的图片registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/"); // 默认头像registry.addResourceHandler("/headimage/**").addResourceLocations("file:"+fileUtils.getPath().getPath()+ File.separator);super.addResourceHandlers(registry);}
}

注意: 此时映射了两个路径

  1. 外部环境的路径
  2. static目录下的路径(该路径用于存放一张默认图片随意一张, 作为默认头像 可命名为 default.png)

4. 用户实体类中 加入 image 字段

该字段默认值为 ‘static/default.png’ 即为用户的默认头像
作用: 存放图片的相对路径

5. Controller层编写

@RestController
@RequestMapping("operate/User")
public class UserController extends BaseController<UserService> {@ApiOperation("修改(可以修改头像和邮箱)")@PutMappingpublic R modify(MultipartFile headImg, String email){return baseService.modify(headImg, email);}
}

6. Service层编写

public interface UserService extends IService<User> {R modify(MultipartFile headImg, String email);
}@Slf4j
@Service
public class UserServiceImpl extends ServiceImpl<UserDao, User> implements UserService {@Autowiredprivate FileUtils fileUtils;/*** 获取当前用户名** @return*/private String getCurrentuserName() {// ...return username;}/*** 获取当前用户** @return*/public User getCurrentuser() {// ...return user;}@Overridepublic R modify(MultipartFile headImg, String email) {// 校验图片格式if (!imageTypeRight(headImg)) return R.fail("图片格式不正确");// 获取上传文件后的路径String path = uploadFile(headImg);User currentuser = getCurrentuser();// 删除之前的头像(如果是默认头像不删除)String image = currentuser.getImage();if (!image.equals("static/default.png")) {if (!fileUtils.del(image.substring(path.indexOf("/") + 1))) {log.info("修改头像时, 原来的头像删除失败");} else {log.info("修改头像时, 原来的头像删除成功");}}// 修改数据库中头像的路径信息 和 邮箱update(Wrappers.<User>lambdaUpdate().set(User::getEmail, email).set(User::getImage, path).eq(User::getUsername, currentuser.getUsername()));// 该路径为图片相对路径 可放在url中的服务后面 进行访问// 比如: http://localhost:9000/cloudos-opt/headimage/01c8806dc26d45539b53c22c766cd250.jpg// http://localhost:9000/cloudos-opt/static/default.pngreturn R.success(null, path);}/*** 验证图片的格式** @param file 图片* @return*/private boolean imageTypeRight(MultipartFile file) {// 首先校验图片格式List<String> imageType = Lists.newArrayList("jpg", "jpeg", "png", "bmp", "gif");// 获取文件名,带后缀String originalFilename = file.getOriginalFilename();// 获取文件的后缀格式String fileSuffix = originalFilename.substring(originalFilename.lastIndexOf(".") + 1).toLowerCase();  //不带 .if (!imageType.contains(fileSuffix)) return false;return true;}/*** 上传文件** @param file* @return 返回路径*/public String uploadFile(MultipartFile file) {String originalFilename = file.getOriginalFilename();String fileSuffix = originalFilename.substring(originalFilename.lastIndexOf(".") + 1).toLowerCase();// 只有当满足图片格式时才进来,重新赋图片名,防止出现名称重复的情况String newFileName = UUID.randomUUID().toString().replaceAll("-", "") + "." + fileSuffix;// 该方法返回的为当前项目的工作目录,即在哪个地方启动的java线程File fileTransfer = new File(fileUtils.getPath(), newFileName);try {file.transferTo(fileTransfer);log.info("头像上传: " + fileTransfer.getPath());} catch (IOException e) {e.printStackTrace();}// 将图片相对路径返回给前端return "headimage/" + newFileName;}
}

7. 测试

  • 获取默认头像的路径url为
    http://localhost:8080/{spring-application-name}/static/default.png

  • 修改头像
    修改完成后, 返回相对路径

  • 访问修改后的头像
    带上相对路径在url上直接可以访问

Springboot 上传头像相关推荐

  1. 解决 springboot 上传头像后台接收 MultipartFile 为 null 问题

    springboot 参数上传需要加注解类型识别 错误示范(该方式获取 MultipartFile  为null ): @ApiOperation(value = "设置用户头像" ...

  2. springboot上传头像

    控制层 1. 规划异常 FileUploadException 泛指文件上传异常(父类)继承RuntimeException FileEmptyException 文件为空 FileSizeExcep ...

  3. springboot项目上传头像回显

    springboot项目使用ajax上传头像回显 先上效果图: 开始上传 点击提交 环境: springboot2.2.5.RELEASE jdk:1.8 thymeleaf:3.0.4.RELEAS ...

  4. springboot+vue实现上传头像文件到阿里云对象存储oss

    在阿里云oss上创建一个bucket,获取四个信息: 编写工具类,提供对外调用四个信息的方法: //当项目一启动,就执行接口的方法,读取配置文件内容 @Component public class C ...

  5. 上传头像并回显(SpringBoot)

    以前经常写上传头像功能,上传头像完回显出来,通常套路是: 数据库保存文件名(自己加工过,防止重名) 然后文件路径写到前台的绝对路径.前台直接用../相对路径的方式显示出来. 但是这样有一个问题就是当我 ...

  6. springboot用户上传头像

    用户上传头像流程 1.图片上传至服务器 @PostMapping("upload") public String uploadHeader(MultipartFile header ...

  7. 上传excel腾讯云服务器,使用SpringBoot上传文件到腾讯云

    最近在做一个项目,涉及到腾讯云上传文件/图片到服务器,为了图方便并且提升访问速度,想着上传到腾讯云存储桶是一个不错的选择.腾讯云存储桶的创建可见我之前的文章. 当然存储桶里面不仅可以存图片,也可以存储 ...

  8. 用户上传头像以及BUG修改

    持久层 1.sql语句的规划 上传文件的操作其实是:先将用户上传的文件保存到服务器端的某个位置,然后将保存文件的路径记录在数据库中.当后续需要使用该文件时,从数据库中读出文件的路径,即可实现在线访问该 ...

  9. SpringBoot-项目1-用户(注册,登录,修改密码,修改个人资料,上传头像)

    1. 项目分析 在设计一款软件时,在编写代码之前,应该先分析这个项目中需要处理哪些类型的数据!例如,本项目中需要处理的数据种类有:收藏,购物车,用户,收货地址,订单,商品,商品类别. 当确定了需要处理 ...

最新文章

  1. lsof 查看一个进程打开哪些fd及对应的文件或套接字操作
  2. Ubuntu : 未找到 ‘nm-tool‘ 命令
  3. 【F3简介】一张图看懂FPGA-F3实例
  4. python123测验答案测验3_知到app数学分析3-3测验答案查询服务
  5. m3u8格式转换mp4软件_怎么把mkv格式转换成mp4?教你转换mkv格式的方法
  6. 在线数据库设计ERD-ONLINE
  7. 23. 变量、作用域和内存问题
  8. 解决Ubuntu下Sublime Text 3无法输入中文
  9. MySql 把B表数据插入到A表中
  10. unity3D跑酷游戏源码,支持安卓+IOS双端 unity2019 C#语言开发
  11. linux安装ping命令
  12. 可以在搜索中突出显示网页上的多个单词_使用片段嵌入进行文档搜索
  13. FileZilla打开连接后本地站点无法显示自己的本地电脑
  14. Noise aware learning for speech enhancement
  15. openwrt路由器挂载sdcard为overlay
  16. 社会保险费的缴费基数与缴费比例
  17. 文件不小心删除了怎么恢复?实用的两个小妙招
  18. Android中ButterKnife(黄油刀)的详细使用
  19. Redis数据结构:快速的Redis有哪些慢操作?
  20. element表格固定表头

热门文章

  1. killall 后面信号_Linux命令之killall
  2. 修改Hosts地址让iTunes下载应用快捷如飞
  3. 触目惊心:2015十大最具影响力的数据泄密事件
  4. ResultMap总结
  5. JS 跳转到新页面并用post传参
  6. mysql报错502_Nginx+uWSGI+Django 502 Bad Gateway错误
  7. 【第1158期】哔哩哔哩的前端之路
  8. Cocos Crator开发攻略,小游戏开发全过程
  9. 用Python清理收藏夹里已失效的网站,快测试一下你的收藏夹吧
  10. async和await