一、课程介绍
【课程名称】SpringBoot 2.x 实战仿B站高性能后端项目。
【章节】第四章 4.8 、 4.9 文件分片
【讲师】HELLOSTAR
二、课程内容
文件分片
文件分片实现逻辑
使用java.io接口对字节流进行读写操作,将上传的文件以字节流的形式按设定的分片大小划分。
偏移量是在文件流中的下标位置。这个下标位置也是每个分片读取部分流文件的起始位置。
使用RandomAccessFile类每次从当前分片起始位置读取文件,并向文件夹中写入当前分片大小的文件。(因为最后一个分片小于分片长度)
每个分片按序号顺序命名,生成各个分片文件并写入到临时文件夹中。
文件分片实现代码
1.将MultiPartFile文件类型转换成file文件类型
public File multipartFileToFile(MultipartFile multipartFile) throws Exception{
String originalFileName = multipartFile.getOriginalFilename();
String[] fileName = originalFileName.split("\\.");
File file = File.createTempFile(fileName[0], "." + fileName[1]);
multipartFile.transferTo(file);
return file;
}
2.文件分片,并记录分片总数量
//分片大小
private static final int SLICE_SIZE = 1024 * 1024 * 2;
//文件分片功能
public void convertFileToSlices(MultipartFile multipartFile) throws Exception{
String fileType = this.getFileType(multipartFile);
//生成临时文件,将MultipartFile转为File
File file = this.multipartFileToFile(multipartFile);
long fileLength = file.length();
int count = 1;
for(int i = 0; i < fileLength; i += SLICE_SIZE){
RandomAccessFile randomAccessFile = new RandomAccessFile(file, "r");
//将文件的读写指针移动至当前偏移位置
randomAccessFile.seek(i);
byte[] bytes = new byte[SLICE_SIZE];
//读取分片的长度(最后一个分片长度未知)
int len = randomAccessFile.read(bytes);
String path = "/Users/hat/tmpfile/" + count + "." + fileType;
File slice = new File(path);
FileOutputStream fos = new FileOutputStream(slice);
//写入文件
fos.write(bytes, 0, len);
fos.close();
randomAccessFile.close();
//记录分片总个数
count++;
}
//删除临时文件
file.delete();
}
三、课程收获
使用Java的IO接口即可实现文件的分片。实现原理是按照文件的偏移量逐片读取的文件,即是每一个分片文件。之后可以做后续业务处理。比如实现文件断点续传,秒传。(每个分片文件分配MD5值,在服务端校验服务器中是否存在)