在当前数字化时代,文件上传功能是各类Web应用中不可或缺的一部分。本文将为您展示如何利用Spring Boot框架及其优秀生态构建一个优雅且安全的文件上传服务——`UploadFileServiceImp`。此服务不仅实现了批量处理上传请求、确保文件安全存储,还通过JWT令牌提取用户ID,并将文件访问地址妥善保存至数据库中。
首先,我们关注`UploadFileServiceImp`的核心实现逻辑。该类作为服务接口`UploadFileService`的实现,注入了HttpServletRequest对象以捕获客户端请求中的重要信息,如JWT令牌。通过Hutool库解析令牌,获取并转换用户的唯一标识(ID),确保文件上传与用户身份紧密关联,提高了系统安全性。
代码中使用了 请导包使用此代码
hutool包
lombok包
uploadFilesCollectionImp Collection实现类
/**
* @author 青衫烟雨客
* @description 文件上传控制器实现类,负责处理客户端通过HTTP POST方式发起的多文件上传请求,并将上传的文件持久化保存到服务器指定目录。
* 使用Spring MVC框架中的`@RequestMapping("/upload")`注解定义了文件上传API的基础路径。
* @since 2024/02/03
*/
@Slf4j
@RestController
@RequestMapping("/upload")
public class uploadFilesCollectionImp {
@Autowired
private uploadFileServiceImp uploadFileServiceImp;
/**
* 处理POST方法的多文件上传请求,接收一个MultipartFile类型的数组参数。
*
* @param files 客户端提交的待上传文件集合
* @return Result 对象封装了上传结果信息。如果所有文件上传成功,则返回包含每个文件完整访问地址的Result.success对象;
* 若有文件上传失败,则返回Result.error对象并附带错误提示信息。
*/
@PostMapping
public R upload(@RequestParam("files") MultipartFile[] files) {
try {
List<String> uploadFileUrls = uploadFileServiceImp.uploadFile(files);
// 如果上传成功,则返回包含文件URL的R.success对象
if (!CollectionUtils.isEmpty(uploadFileUrls)) {
return R.success(uploadFileUrls);
}
// 如果上传失败且uploadFileUrls为空(假设这代表失败)
return R.error("文件上传失败");
} catch (RuntimeException e) {
// 捕获自定义异常,如文件上传过程中可能出现的问题
log.error("文件上传时发生错误:{}", e.getMessage());
return R.error("文件上传失败:" + e.getMessage());
} catch (Exception e) {
// 其他未知异常
log.error("文件上传时发生未知错误:{}", e.getMessage());
return R.error("文件上传过程中出现未知错误");
}
}
}
UploadFileService Service接口层
/**
* @author 青衫烟雨客
* @description 文件上传服务接口,定义了处理文件批量上传业务逻辑的方法。
* @date 创建时间: 2024/2/7
*/
public interface UploadFileService {
/**
* 批量上传文件方法。该方法接收一个MultipartFile数组,代表用户要上传的多个文件,
* 并返回一个包含所有成功上传文件访问链接地址的字符串列表。
*
* @param files MultipartFile[] 用户选择并提交的多个待上传文件对象
* @return List<String> 成功上传文件的网络访问链接地址列表,每个地址对应一个上传成功的文件
*/
List<String> uploadFile(MultipartFile[] files);
}
UploadFileService Service实现类
/**
* @author 青衫烟雨客
* @date 2024/1/2
* @description 实现文件上传服务接口的类,负责处理文件上传逻辑并存储到服务器,并将文件访问地址存入数据库
*/
@Slf4j
@Service
public class uploadFileServiceImp implements UploadFileService {
// Spring自动注入HttpServletReq