为了账号安全,请及时绑定邮箱和手机立即绑定

【九月打卡】第21天 秒传功能

标签:
Java

一、课程介绍

【课程名称】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人点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消