1.构建类
java
public class MultipartFileParam {
// 用户id
private String uid;
//任务ID
private String id;
//总分片数量
private int chunks;
//当前为第几块分片
private int chunk;
//当前分片大小
private long size = 0L;
//文件名
private String name;
//分片对象
private MultipartFile file;
// MD5
private String md5;
}
2.分断上传方法,
传入文件大小由前端指定,这个方法只负责保存分片文件
java
/**
*保存分配图片
**/
public void uploadFile(MultipartFileParam param) {
// 文件每次分片的下标
int chunkIndex = param.getChunk();
//将前端生成的md5创建成一个文件
File file = new File(rootPath + File.separator + "dataFile" + File.separator + "temp" + File.separator + param.getMd5());
if (!file.exists()) {
file.mkdir();
}
//创建临时分片文件将 chunkIndex作为名称生成文件
File chunkFile = new File(
rootPath + File.separator + "dataFile" + File.separator + "temp" + File.separator + param.getMd5() + File.separator + chunkIndex);
//将前端上传的数据保存到这个文件里面
FileUtils.copyInputStreamToFile(param.getFile().getInputStream(), chunkFile);
}
3.合并方法
吧哪些分片文件合并成一个返回文件地址就行了
(还可以写一个检查的接口md5参数如果上传文件一样的话是一样的结果可以先判定一下直接返回)
java
public String mergeFile(String fileMd5,String fileName) {
// 读取目录里的所有的分片文件
File dir = new File(rootPath + File.separator + "dataFile" + File.separator + "temp" + File.separator + fileMd5);
File[] childs = dir.listFiles();
if (Objects.isNull(childs) || childs.length == 0) {
return null;
}
// 转成集合,便于排序
List<File> fileList = new ArrayList<File>(Arrays.asList(childs));
Collections.sort(fileList, new Comparator<File>() {
@Override
public int compare(File o1, File o2) {
if (Integer.parseInt(o1.getName()) < Integer.parseInt(o2.getName())) {
return -1;
}
return 1;
}
});
// 创建合并后的文件地址
File outputFile = new File(rootPath + File.separator + "dataFile" + File.separator + "merge" + File.separator + fileMd5 + File.separator + fileName);
// 创建文件
if (!outputFile.exists()) {
File mergeMd5Dir = new File(rootPath + File.separator + "dataFile" + File.separator + "merge" + File.separator + fileMd5);
if (!mergeMd5Dir.exists()) {
mergeMd5Dir.mkdirs();
}
logger.info("创建文件");
outputFile.createNewFile();
}
}