利用多线程处理批量上传文件,能够加快任务处理耗时。
package com.ruoyi.print_system.controller;
import com.ruoyi.common.core.controller.baseController;
import com.ruoyi.common.core.domain.AjaxResult;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import java.io.*;
import java.util.*;
import java.util.concurrent.*;
@RestController
@RequestMapping("/print_system/")
public class UploadController extends baseController {
@PostMapping(value = "/upload/batch/photo")
public AjaxResult batchUploadFile(MultipartFile[] file) {
AjaxResult ajaxResult = new AjaxResult();
Map data = new HashMap<>(2);
//文件个数
int size = file.length;
//每个文件id集合
List fileIds = new ArrayList<>();
//根据文件的长度设置线程池
ExecutorService executorService = Executors.newFixedThreadPool(size);
//每一个任务的list
List> taskList = new ArrayList<>();
try {
for (int i = 0; i < size; i++) {
//把每一个文件放入异步任务中 去执行
FutureTask task = new FutureTask<>(new SumJob(file[i]));
executorService.execute(task);
//把每一个任务的返回信息放进入
taskList.add(task);
}
for (FutureTask item : taskList) {
try {
//把每一个id放入集合中
fileIds.add(item.get());
} catch (Exception e) {
e.printStackTrace();
}
}
} catch (Exception e) {
ajaxResult.setCode(999);
ajaxResult.setMsg("上传失败");
ajaxResult.setData(String.valueOf(e));
return ajaxResult;
}
//返回消息体
ajaxResult.setCode(200);
ajaxResult.setMsg("上传成功");
data.put("success", fileIds.size());
data.put("fail", file.length - fileIds.size());
ajaxResult.setData(data);
return ajaxResult;
}
}
class SumJob implements Callable {
private final Logger logger = LoggerFactory.getLogger(SumJob.class);
private MultipartFile file = null;
public SumJob(MultipartFile file) {
super();
this.file = file;
}
@Override
public String call() throws Exception {
//创建文件在服务器端存放路径
final String dir = "/home/photo";
File fileDir = new File(dir);
//如果目录不存在,创建目录
if (!fileDir.exists()) {
fileDir.mkdirs();
logger.info(dir + "目录创建成功");
}
String oldFileName = file.getOriginalFilename();
String suffix = oldFileName.substring(oldFileName.lastIndexOf("."));
//对文件名进行统一处理
String newFileName = oldFileName.substring(0, 18) + suffix.toLowerCase();
String filePath = fileDir + File.separator + newFileName;
File files = new File(filePath);
//文件保存到目录中
file.transferTo(files);
//返回上传路径
return filePath;
}
}



