修改管理员头像接口
@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
该接口实现的功能:
- 权限验证: 验证用户是否具有修改管理员信息的权限。
- 头像删除: 删除管理员之前上传的头像。
- 头像上传: 上传新的头像,并验证文件类型。
- 头像存储: 将上传的头像保存到服务器指定路径。
- 管理员信息更新: 更新管理员的头像URL。
接口使用说明:
- 请求方式: POST
- 请求地址: /updateOneAdminByIdByFile
- 请求参数:
- file: 上传的头像文件
- adminId: 管理员ID
- 返回值:
- Result: 接口调用结果
- ResultCode: 状态码
- data: 修改成功后的管理员信息
注意事项:
- 请确保上传的头像文件类型为GIF、PNG或JPG。
- 上传文件大小需符合服务器配置限制。
- 确保管理员ID合法有效。
- 请确保服务器配置了图片存储路径。
- 为了安全起见,建议配置身份验证机制,例如 JWT,来确保只有授权用户才能访问该接口。
代码优化建议:
- 可以使用 Spring Validation 对请求参数进行校验,提高接口健壮性。
- 可以使用 AOP 对权限验证进行统一处理。
- 可以使用缓存来提高图片读取速度。
- 可以使用异步线程池来处理头像上传,提高接口响应速度。
- 可以使用对象映射工具,例如 MapStruct,来简化对象转换操作。
- 可以使用日志框架,例如 SLF4J 或 Logback,来记录接口调用日志。
测试建议:
- 使用 Postman 等工具模拟不同情况的请求,测试接口功能是否正常。
- 测试上传不同类型的图片文件,验证文件类型校验功能是否正常。
- 测试上传超过文件大小限制的图片文件,验证文件大小限制功能是否正常。
- 测试删除管理员之前上传的头像,验证头像删除功能是否正常。
- 测试更新管理员的头像URL,验证管理员信息更新功能是否正常。
安全建议:
- 避免使用硬编码的路径,可以使用配置文件或环境变量来配置路径。
- 对用户上传的文件进行安全检查,例如验证文件类型和文件大小。
- 避免在 URL 中直接暴露敏感信息,例如管理员ID。
- 使用 HTTPS 协议来加密网络传输数据。
- 定期更新服务器软件和依赖库,修复安全漏洞。
其他:
- 本接口仅供参考,具体实现细节可能需要根据实际情况进行调整。
- 建议使用代码规范和最佳实践来编写代码,提高代码可读性和可维护性。
- 建议使用单元测试来测试代码逻辑,确保代码质量。
- 建议使用代码审查机制来发现代码缺陷,提高代码可靠性。
- 建议使用版本控制工具,例如 Git,来管理代码版本,方便代码回退和协作。
总结: 该接口提供了一个基本的管理员头像修改功能,开发者可以根据实际情况进行扩展和优化,例如增加头像裁剪、压缩等功能。
相关链接: Spring Boot 文件上传 JWT SLF4J Logback MapStruct Postman Git
原文地址: https://www.cveoy.top/t/topic/ql3g 著作权归作者所有。请勿转载和采集!