@PostMapping("/updateOneAdminByIdByFile")
public Result<Object> updateOneAdminByIdByFile(@RequestParam(value = "file", required = false) MultipartFile file,
                                                   @RequestParam(value = "adminId", required = false) Long adminId,
                                                   HttpServletRequest request) throws IOException {

        //权限验证
        String token = (String) request.getAttribute("claims_admin");
        if (token == null || "".equals(token)) {
            log.info("token:" + token);
            throw new RuntimeException("权限不足!");
        }

        //先查询出需要修改的管理员对象
        Admin admin = adminService.queryOneAdminByID(adminId);

        if (admin == null) {
            log.error("没查到当前用户!");
            return new Result<>(ResultCode.FAIL);
        }

        //删除本地上个头像
        if (!StringUtils.isEmpty(admin.getAvatarUrl())) {
            String picName = StringUtils.substringAfterLast(admin.getAvatarUrl(), "/");

            log.info("删除头像:" + picName);

            if (!"1.jpg".equals(picName)) {
                String path1 = realPath + picName;
                File file1 = new File(path1);// 根据指定的文件名创建File对象

                if (!file1.exists()) {
                    log.info("文件" + path1 + "不存在,删除失败!");
                } else if (file1.isFile()) {
                    log.info(file1.delete() ? "删除头像成功!" : "删除头像失败!");
                }
            }
        }

        //上传新头像
        if (file == null || file.isEmpty()) {
            log.error("文件为空!");
            return new Result<>(ResultCode.FAIL);
        }

        String fileName = file.getOriginalFilename();
        String type = StringUtils.substringAfterLast(fileName, ".");
        if (!StringUtils.equalsIgnoreCase("gif", type) && !StringUtils.equalsIgnoreCase("png", type) && !StringUtils.equalsIgnoreCase("jpg", type)) {
            log.error("不是我们想要的文件类型,请按要求重新上传");
            return new Result<>(ResultCode.FAIL);
        }


        // 自定义的文件名称
        String pdNo = UUID.randomUUID().toString().replaceAll("-", "");
        String trueFileName = pdNo + "-" + LocalDate.now() + ".jpg";
        String path = realPath + trueFileName;
        File dest = new File(path);
        if (!dest.getParentFile().exists() && !dest.getParentFile().mkdir()) {
            log.error("创建文件夹失败!");
            return new Result<>(ResultCode.FAIL);
        }
        file.transferTo(dest);

        //更新管理员对象并保存
        String avatarUrl = request.getScheme() + "//" + request.getServerName() + ":" + request.getServerPort() + "/download/" + trueFileName;
        admin.setAvatarUrl(avatarUrl);
        int ret = adminService.updateOneAdminByID(admin);
        if (ret > 0) {
            log.info("修改管理员成功!" + admin);
            return new Result<>(ResultCode.SUCCESS);
        } else {
            log.error("修改管理员失败!");
            return new Result<>(ResultCode.FAIL);
        }
    }

// 解决文件上传大小限制报错
// 在application.properties或application.yml文件中进行配置
// spring.servlet.multipart.max-file-size=10MB
// spring.servlet.multipart.max-request-size=10MB

该接口实现的功能:

  1. 权限验证: 验证用户是否具有修改管理员信息的权限。
  2. 头像删除: 删除管理员之前上传的头像。
  3. 头像上传: 上传新的头像,并验证文件类型。
  4. 头像存储: 将上传的头像保存到服务器指定路径。
  5. 管理员信息更新: 更新管理员的头像URL。

接口使用说明:

  1. 请求方式: POST
  2. 请求地址: /updateOneAdminByIdByFile
  3. 请求参数:
    • file: 上传的头像文件
    • adminId: 管理员ID
  4. 返回值:
    • Result: 接口调用结果
    • ResultCode: 状态码
    • data: 修改成功后的管理员信息

注意事项:

  1. 请确保上传的头像文件类型为GIF、PNG或JPG。
  2. 上传文件大小需符合服务器配置限制。
  3. 确保管理员ID合法有效。
  4. 请确保服务器配置了图片存储路径。
  5. 为了安全起见,建议配置身份验证机制,例如 JWT,来确保只有授权用户才能访问该接口。

代码优化建议:

  1. 可以使用 Spring Validation 对请求参数进行校验,提高接口健壮性。
  2. 可以使用 AOP 对权限验证进行统一处理。
  3. 可以使用缓存来提高图片读取速度。
  4. 可以使用异步线程池来处理头像上传,提高接口响应速度。
  5. 可以使用对象映射工具,例如 MapStruct,来简化对象转换操作。
  6. 可以使用日志框架,例如 SLF4J 或 Logback,来记录接口调用日志。

测试建议:

  1. 使用 Postman 等工具模拟不同情况的请求,测试接口功能是否正常。
  2. 测试上传不同类型的图片文件,验证文件类型校验功能是否正常。
  3. 测试上传超过文件大小限制的图片文件,验证文件大小限制功能是否正常。
  4. 测试删除管理员之前上传的头像,验证头像删除功能是否正常。
  5. 测试更新管理员的头像URL,验证管理员信息更新功能是否正常。

安全建议:

  1. 避免使用硬编码的路径,可以使用配置文件或环境变量来配置路径。
  2. 对用户上传的文件进行安全检查,例如验证文件类型和文件大小。
  3. 避免在 URL 中直接暴露敏感信息,例如管理员ID。
  4. 使用 HTTPS 协议来加密网络传输数据。
  5. 定期更新服务器软件和依赖库,修复安全漏洞。

其他:

  1. 本接口仅供参考,具体实现细节可能需要根据实际情况进行调整。
  2. 建议使用代码规范和最佳实践来编写代码,提高代码可读性和可维护性。
  3. 建议使用单元测试来测试代码逻辑,确保代码质量。
  4. 建议使用代码审查机制来发现代码缺陷,提高代码可靠性。
  5. 建议使用版本控制工具,例如 Git,来管理代码版本,方便代码回退和协作。

总结: 该接口提供了一个基本的管理员头像修改功能,开发者可以根据实际情况进行扩展和优化,例如增加头像裁剪、压缩等功能。

相关链接: Spring Boot 文件上传 JWT SLF4J Logback MapStruct Postman Git

修改管理员头像接口

原文地址: https://www.cveoy.top/t/topic/ql3g 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录