依赖
org.springframework.boot
spring-boot-starter-thymeleaf
cn.hutool
hutool-all
5.7.21
com.alibaba
fastjson
1.2.80
org.springframework.boot
spring-boot-starter-web
Hmlt
Title
控制层
@PostMapping("/uploadBigFile")
public ResponseData uploadBigFile(@RequestParam("file") MultipartFile file,@RequestParam("filename") String filename) {
return fileService.uploadBigFile(file,filename);
}
@GetMapping("/mergeBigFile")
public ResponseData mergeBigFile(@RequestParam("chunks")Integer chunks,String exname) {
return fileService.mergeBigFile(chunks,exname);
}
实现层
@Override
public ResponseData uploadBigFile(MultipartFile file, String filename) {
try {
String path = upload + "/" + filename;
File fileUploadPath = new File(path);
if (!fileUploadPath.exists()) {
fileUploadPath.createNewFile();
file.transferTo(fileUploadPath);
}
return ResponseData.success("上传成功", "");
} catch (IOException e) {
e.printStackTrace();
}
return ResponseData.failure("上传文件失败");
}
@Override
public ResponseData mergeBigFile(Integer chunks,String exname) {
RandomAccessFile raf = null;
try {
//申明随机读取文件RandomAccessFile
File file = new File(upload+"/"+IdUtil.createId()+exname);
if (!file.exists()) {
file.createNewFile();
}
raf = new RandomAccessFile(file, "rw");
//开始合并文件,对应切片的二进制文件
for (int i = 0; i < chunks; i++) {
File file1 = new File(upload + "/chunk_" + i + exname);
//读取切片文件
RandomAccessFile reader = new RandomAccessFile(file1, "r");
byte[] b = new byte[1024];
int n = 0;
//先读后写
while ((n = reader.read(b)) != -1) {
raf.write(b, 0, n);
}
reader.close();
if (file1.exists()) {
file1.delete();
}
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
raf.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return ResponseData.success("文件上传成功");
}
IdUtil
@Component
public class IdUtil {
private static Snowflake snowflake=null;
public static String createId () {
if(StrUtil.isBlankIfStr (snowflake)){
snowflake = cn.hutool.core.util.IdUtil.getSnowflake (1, 1);
}
return snowflake.nextId ()+"";
}
}