当前位置:   article > 正文

手把手教你用Spring Boot实现上传头像功能

wx.uploadfile springboot 头像上传

1.前言

上传文件的功能在开发中很常见,趁着刚做完一个项目中上传头像的功能,将流程记录下来方便以后复用,也有利于加深印象。

为了避免影响理解,做了简化,用户类只设置了两个字段,一个是用户id,一个是用户头像存储路径。

2.目录结构

3.功能实现

controller层

  • UploadController
  1. @Controller
  2. public class UploadController {
  3. @Autowired
  4. UserService userService;
  5. @PostMapping("/upload")
  6. public String upload(MultipartFile file, HttpSession session) throws IOException {
  7. //获取文件的内容
  8. InputStream is = file.getInputStream();
  9. //获取原始文件名
  10. String originalFilename = file.getOriginalFilename();
  11. //生成一个uuid名称出来
  12. String uuidFilename = UploadUtils.getUUIDName(originalFilename);
  13. //产生一个随机目录
  14. String randomDir = UploadUtils.getDir();
  15. File fileDir = new File("D:/uploadfiles" + randomDir);
  16. //若文件夹不存在,则创建出文件夹
  17. if (!fileDir.exists()) {
  18. fileDir.mkdirs();
  19. }
  20. //创建新的文件夹
  21. File newFile = new File("D:/uploadfiles" + randomDir, uuidFilename);
  22. //将文件输出到目标的文件中
  23. file.transferTo(newFile);
  24. //将保存的文件路径更新到用户信息headimg中
  25. String savePath = randomDir + "/" + uuidFilename;
  26. //获取当前的user
  27. User user = (User) session.getAttribute("user");
  28. //设置头像图片路径
  29. user.setAvatar(savePath);
  30. //调用业务更新user
  31. userService.update(user);
  32. //生成响应 : 跳转去用户详情页面
  33. return "redirect:/userInfo";
  34. }
  35. @Autowired
  36. ResourceLoader resourceLoader;
  37. @GetMapping("/get/{dir1}/{dir2}/{filename:.+}")
  38. public ResponseEntity get(@PathVariable String dir1,
  39. @PathVariable String dir2,
  40. @PathVariable String filename) {
  41. //1.根据用户名去获取相应的图片
  42. Path path = Paths.get("D:/uploadfiles" + "/" + dir1 + "/" + dir2, filename);
  43. //2.将文件加载进来
  44. Resource resource = resourceLoader.getResource("file:" + path.toString());
  45. //返回响应实体
  46. return ResponseEntity.ok(resource);
  47. }
  48. }
  49. 复制代码
  • UserController
  1. @Controller
  2. public class UserController {
  3. @Autowired
  4. UserService userservice;
  5. @GetMapping("/userInfo")
  6. public String userInfo(HttpSession session) {
  7. //从session获取User对象
  8. User user = (User) session.getAttribute("user");
  9. //如果用户为空,则创建新的对象
  10. if (user == null) {
  11. user = new User();
  12. user.setUid(UUID.randomUUID().toString());
  13. //设置默认头像
  14. String avatar = "/0/D/359EC8DE4BE24833A4BAFA98136E0A67.jpeg";
  15. user.setAvatar(avatar);
  16. session.setAttribute("user",user);
  17. }
  18. //否则直接进入用户信息页面
  19. return "userInfo";
  20. }
  21. }
  22. 复制代码

dao层

  1. public interface UserRepository extends JpaRepository<User,String> {
  2. }
  3. 复制代码

service层接口

  1. public interface UserService {
  2. //更新用户信息
  3. void update(User user);
  4. }
  5. 复制代码

service层实现类

  1. @Service
  2. public class UserServiceImpl implements UserService {
  3. @Autowired
  4. UserRepository userRepository;
  5. @Override
  6. public void update(User user) {
  7. userRepository.save(user);
  8. }
  9. }
  10. 复制代码

entity层

  1. @Entity
  2. @Table(name = "user")
  3. public class User {
  4. //用户id
  5. @Id
  6. private String uid;
  7. //用户头像路径
  8. private String avatar;
  9. public User() {
  10. }
  11. public User(String uid, String username, String password, String avatar) {
  12. this.uid = uid;
  13. this.avatar = avatar;
  14. }
  15. public String getUid() {
  16. return uid;
  17. }
  18. public void setUid(String uid) {
  19. this.uid = uid;
  20. }
  21. public String getAvatar() {
  22. return avatar;
  23. }
  24. public void setAvatar(String avatar) {
  25. this.avatar = avatar;
  26. }
  27. @Override
  28. public String toString() {
  29. return "User{" +
  30. "uid='" + uid + '\'' +
  31. ", avatar='" + avatar + '\'' +
  32. '}';
  33. }
  34. }
  35. 复制代码

工具类

  1. public class UploadUtils {
  2. /**
  3. * 获取文件真实名称
  4. * 由于浏览器的不同获取的名称可能为:c:/upload/1.jpg或者1.jpg
  5. * 最终获取的为 1.jpg
  6. * @param name 上传上来的文件名称
  7. * @return 真实名称
  8. */
  9. public static String getRealName(String name) {
  10. //获取最后一个"/"
  11. int index = name.lastIndexOf("\\");
  12. return name.substring(index + 1);
  13. }
  14. /**
  15. * 获取随机名称
  16. *
  17. * @param realName 真实名称
  18. * @return uuid 随机名称
  19. */
  20. public static String getUUIDName(String realName) {
  21. //realname 可能是 1sfasdf.jpg 也可能是 1sfasdf 1
  22. //获取后缀名
  23. int index = realName.lastIndexOf(".");
  24. if (index == -1) {
  25. return UUID.randomUUID().toString().replace("-", "").toUpperCase();
  26. } else {
  27. return UUID.randomUUID().toString().replace("-", "").toUpperCase() + realName.substring(index);
  28. }
  29. }
  30. /**
  31. * 获取文件目录,可以获取256个随机目录
  32. * @return 随机目录
  33. */
  34. public static String getDir() {
  35. String s = "0123456789ABCDEF";
  36. Random r = new Random();
  37. // /A/A
  38. return "/" + s.charAt(r.nextInt(16)) + "/" + s.charAt(r.nextInt(16));
  39. }
  40. }
  41. 复制代码

启动类

  1. @SpringBootApplication
  2. public class MainApplication {
  3. public static void main(String[] args) {
  4. SpringApplication.run(MainApplication.class, args);
  5. }
  6. }
  7. 复制代码

用户信息页面

  1. <!DOCTYPE html>
  2. <html xmlns:th="http://www.thymeleaf.org">
  3. <head>
  4. <meta charset="UTF-8"/>
  5. <meta name="viewport" content="width=device-width, initial-scale=1"/>
  6. <title>上传头像</title>
  7. <!-- 最新版本的 Bootstrap 核心 CSS 文件 -->
  8. <link rel="stylesheet" th:href="@{/css/bootstrap.min.css}"/>
  9. <!--导入jquery的文件-->
  10. <script type="text/javascript" th:src="@{/js/jquery-1.11.0.js}"></script>
  11. <!-- 最新的 Bootstrap 核心 JavaScript 文件 -->
  12. <script th:src="@{/js/bootstrap.min.js}"></script>
  13. </head>
  14. <body>
  15. <div class="container-fluid">
  16. <!--用户信息栏-->
  17. <div class="row">
  18. <div class="col-md-12 text-center">
  19. <div class="row">
  20. <img th:src="|@{/get}${session.user.avatar}|"
  21. class="img-circle img-thumbnail" style="width:100px;height:100px"/>
  22. </div>
  23. <div class="row">
  24. <button class="btn btn-primary" data-toggle="modal" data-target="#myModal">上传头像
  25. </button>
  26. </div>
  27. //弹出框
  28. <div class="modal fade" id="myModal" tabindex="-1" role="dialog"
  29. aria-labelledby="myModalLabel"
  30. aria-hidden="true">
  31. <div class="modal-dialog">
  32. <!--content-->
  33. <div class="modal-content">
  34. <div class="modal-header">
  35. <button type="button" class="close" data-dismiss="modal"
  36. aria-hidden="true">
  37. &times;
  38. </button>
  39. </div>
  40. <!--body-->
  41. <div class="modal-body">
  42. <form action="/upload" method="post" enctype="multipart/form-data">
  43. <div class="row">
  44. <input type="file" name="file"/><br/>
  45. <input type="submit" value="文件上传" class="btn btn-primary"/><br/>
  46. </div>
  47. </form>
  48. </div>
  49. </div><!-- /.modal-content -->
  50. </div><!-- /.modal -->
  51. </div>
  52. </div>
  53. </div>
  54. </div>
  55. </body>
  56. </html>
  57. 复制代码

配置文件

  1. server:
  2. port: 8090
  3. spring:
  4. #使用H2数据库方便测试
  5. h2:
  6. console:
  7. enabled: true
  8. settings:
  9. web-allow-others: true
  10. path: /h2
  11. datasource:
  12. url: jdbc:h2:file:./user;DB_CLOSE_ON_EXIT=FALSE
  13. driverClassName: org.h2.Driver
  14. username: sa
  15. password: 123
  16. jpa:
  17. database-platform: org.hibernate.dialect.H2Dialect
  18. hibernate:
  19. ddl-auto: update
  20. 复制代码

点击进入Github

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/393422
推荐阅读
相关标签
  

闽ICP备14008679号