Appearance
一、在packagecom.ms.web.controller.common的CommonController中定义了一个方法,用来处理前端文件上传请求: 在你的 uploadFiles 方法中,控制器对前端发送的多文件上传请求进行了处理。以下是该方法的主要步骤和操作:
- 创建一个空的 uploadedFiles 列表,用于存储上传后的文件信息。
List<FileVo> uploadedFiles = new ArrayList<>();
- 遍历每个上传的文件:
for (MultipartFile file : files) {
- 调用 UploadUtil.upload 方法上传每个文件,并获取上传后的文件信息。
FileVo uploadedFile = UploadUtil.upload(file); // 上传文件并获取文件信息
- 创建 FileEntity 对象,以将文件信息保存到数据库。同时还更新了文件的状态dbFile.setConvertedStatus(0);
FileEntity dbFile = new FileEntity(); dbFile.setFileName(uploadedFile.getFileName()); dbFile.setFilePath(uploadedFile.getFilePath()); dbFile.setFileType(uploadedFile.getFileType()); dbFile.setFileSize(uploadedFile.getFileSize()); dbFile.setDelFlag(uploadedFile.getDelFlag()); dbFile.setConvertedStatus(0); fileService.saveFile(dbFile);
- 在这里我们定义一套file操作相关的service,serviceImpl,mapper/FileMapper和FileMapper.xml,实现这个saveFile方法;
- 调用 UploadUtil.pushToConversionQueue 方法,将文件转换任务推送到消息队列或后台任务队列。
UploadUtil.pushToConversionQueue(dbFile.getId());
- 将上传后的文件信息添加到 uploadedFiles 列表中。
uploadedFiles.add(uploadedFile);
- 如果在上述步骤中发生异常,则捕获异常并抛出运行时异常。
} catch (IOException e) { throw new RuntimeException(e); } catch (SchedulerException e) { throw new RuntimeException(e); }
- 返回上传后的文件信息列表。
return R.ok(uploadedFiles, SUCCESS);
通过以上步骤,你的 uploadFiles 方法处理了多文件上传请求,保存了文件信息到数据库,并将文件转换任务推送到了消息队列或后台任务队列进行进一步处理。
二、接下来到了任务队列如何转换这个文件为pdf了,转换后,还要更新我们的files数据表,添加转换后的路径,转换状态和转换失败信息; public void pushToConversionQueue(Long fileId) throws SchedulerException { // 使用Quartz的JobBuilder创建一个新的JobDetail实例。这代表了一个Job的实例。 // 这里指定了Job的实现类为FileConversionJob,并给该Job设置了一个唯一的标识。 JobDetail jobDetail = JobBuilder.newJob(FileConversionJob.class) .withIdentity("fileConversionJob" + fileId, "fileConversionGroup") .build(); // 获取Job的数据映射,并将文件ID放入其中。这样,当Job执行时,我们可以从数据映射中获取到这个ID。 jobDetail.getJobDataMap().put("fileId", fileId); // 使用Quartz的TriggerBuilder创建一个新的SimpleTrigger实例。 // 这里指定了Trigger的标识,并设置该Trigger立即启动。 // 还设置了Trigger的调度策略,即每10秒重复执行一次,并且无限重复。 SimpleTrigger trigger = TriggerBuilder.newTrigger() .withIdentity("fileConversionTrigger" + fileId, "fileConversionGroup") .startNow() .withSchedule(SimpleScheduleBuilder.simpleSchedule() .withIntervalInSeconds(10) .repeatForever()) .build(); // 使用Scheduler(这是Quartz的核心组件)来安排Job的执行。 // 一旦Job被安排,它将根据上面定义的Trigger的策略被执行。 scheduler.scheduleJob(jobDetail, trigger); }
