一、课程介绍
【课程名称】SpringBoot 2.x 实战仿B站高性能后端项目。
【章节】第四章 4.6 断点续传(上)
【讲师】HELLOSTAR
二、课程内容
1.断点续传介绍
fastdfs支持断点续传需要客户进行切片上传,并且切片字节大小小于等于storage配置的buff_size,默认是256k。
当fastdfs storage接收客户端上传数据时,如果出现超时的情况会对文件offset和接收时记录的start、end进行比较,当offset>start 并且 offset < end时即写入文件的数据是应接收的一部分数据时,会truncate。所以当切片大小小于buff_size时,每次写入时如果发生异常,因未达到buff_size,所以服务端还未写入文件,不会产生truncate问题。注意发生异常,下次传输时,需根据fileid获取服务端的文件大小,然后对文件流进行skip之后,继续上传即可。
2.FastDFSd的支持断点续传的服务接口
/**
* 支持断点续传的文件服务接口
* <p>
* <pre>
* 适合处理大文件,分段传输
* </pre>
*
* @author tobato
*/
public interface AppendFileStorageClient extends GenerateStorageClient{
/**
* 上传支持断点续传的文件
*/
StorePath uploadAppenderFile(String groupName, InputStream inputStream, long fileSize, String fileExtName);
/**
* 断点续传文件
*/
void appendFile(String groupName, String path, InputStream inputStream, long fileSize);
/**
* 修改续传文件的内容
*/
void modifyFile(String groupName, String path, InputStream inputStream, long fileSize, long fileOffset);
/**
* 清除续传类型文件的内容
*/
void truncateFile(String groupName, String path, long truncatedFileSize);
/**
* 清除续传类型文件的内容
*/
void truncateFile(String groupName, String path);
}
支持文件断点续传的功能,上传之后返回文件存储路径
//上传可以断点续传的文件
public String uploadAppenderFile(MultipartFile file) throws Exception{
String fileType = this.getFileType(file);
StorePath storePath = appendFileStorageClient.uploadAppenderFile(DEFAULT_GROUP, file.getInputStream(), file.getSize(), fileType);
return storePath.getPath();
}
修改续传文件的内容。offset为修改文件的起始位置。
public void modifyAppenderFile(MultipartFile file, String filePath, long offset) throws Exception{
appendFileStorageClient.modifyFile(DEFAULT_GROUP, filePath, file.getInputStream(), file.getSize(), offset);
}
三、课程收获
了解大文件【断点续传】的实现原理:对文件进行分片,逐片进行上传,中间发生停止的话,记录片的位置,重新上传时从中断的片位置继续上传。
了解【秒传】的实现原理:对每个文件进行MD5加密,每个文件在系统中只存储一份。如果第二次上传的话,根据MD5的密钥自动提示已上传或上传完成,达到秒传的效果。