一、课程介绍
【课程名称】SpringBoot 2.x 实战仿B站高性能后端项目。
【章节】第四章 4.10 、 4.11 秒传、秒传测试
【讲师】HELLOSTAR
二、课程内容
什么是秒传
服务器中存储的每个文件都有一个唯一的MD5加密码。你把要上传的东西上传,服务器会先做MD5校验,此处是将每个文件的服务器存储地址和MD5码保存在数据库中。如果数据库中有一样的MD5码,它就直接给你返回这个MD5码对应的文件地址。用户显示的就是立马上传完成,即秒传文件。
文件的MD5码如何改变:就是对文件本身做一下修改(改名字不行),例如一个文本文件,如果修改文件名或文件类型,并不会影响文件本身的字节流内容。MD5码也不会改变。如果文件里多加几个字,MD5就变了。
秒传实现
使用Java的IO接口将上传的文件以流的形式读取,然后写入到ByteArrayOutputStream,最后使用MD5工具类将该文件的字节流进行加密,得到该文件的MD5加密码,并在数据库中验证是否存在。
//获取文件md5加密后的字符串
public static String getFileMD5(MultipartFile file) throws Exception {
InputStream fis = file.getInputStream();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int byteRead;
//读文件,直到读到文件末尾,返回-1.
while((byteRead = fis.read(buffer)) > 0){
baos.write(buffer, 0, byteRead);
}
fis.close();
return DigestUtils.md5Hex(baos.toByteArray());
}
//文件分片上传(如果文件已存在服务器,则直接返回文件路径。-秒传)
public String uploadFileBySlices(MultipartFile slice,
String fileMD5,
Integer sliceNo,
Integer totalSliceNo) throws Exception {
//查询数据库中是否存在该文件。
File dbFileMD5 = fileDao.getFileByMD5(fileMD5);
if(dbFileMD5 != null){
return dbFileMD5.getUrl();
}
String url = fastDFSUtil.uploadFileBySlices(slice, fileMD5, sliceNo, totalSliceNo);
if(!StringUtil.isNullOrEmpty(url)){
dbFileMD5 = new File();
dbFileMD5.setCreateTime(new Date());
dbFileMD5.setMd5(fileMD5);
dbFileMD5.setUrl(url);
dbFileMD5.setType(fastDFSUtil.getFileType(slice));
fileDao.addFile(dbFileMD5);
}
return url;
}
三、课程收获
每个文件的内容的字节流信息都是唯一的。所以可以用来作为唯一校验码。配合MD5加密每个文件生成唯一的验证码。进而可以实现文件重复上传时系统自动识别,避免占用存储服务器资源,同时大幅提高用户上传体验。
四、学习过程
点击查看更多内容
1人点赞
评论
共同学习,写下你的评论
评论加载中...
作者其他优质文章
正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦