项目实训(一)---大文件分片接收与合并
2021SC@SDUSC
我负责人脸识别算法以及项目后端的编写以及项目整合部署。
这次主要记录我们需要处理的第一个问题:视频上传服务器。这里我们考虑到视频文件比较大的原因,计划采用分片上传。
目录
引言
一.前端处理
二.后端处理
三.执行效果
小结
引言
上传大文件时,我们一般都会采用分片上传的方式,这样如果上传过程中断了,下次继续上传的话就不用重新全部上传,只需继续上传未上传的部分即可,进而可以实现秒传的效果。
其原理其实就是在客户端将文件分割成多个小的分片,然后再将这些分片一片一片的上传给服务端,服务端拿到所有分片后再将这些分片合并起来还原成原来的文件。那服务端怎么知道我合并出来的文件是否和服务端上传的文件完全一样呢?这就需要用到文件的MD5值了。文件的MD5值就相当于是这个文件的“数字指纹”,只有当两个文件内容完全一样时,他们的MD5值才会一样。所以在上传文件前,客户端需要先计算出文件的MD5值,并且把这MD5值传递给服务端。服务端通过MD5唯一标识一个文件。
一.前端处理
首先我写了一个简陋的前端用来测试分片上传。
大文件分片上传,是需要前端和后端配合操作的。
整体流程是:前端将大文件进行分片,例如一个50MB的文件,分成10片,每个片5MB。然后发10个HTTP请求,将这10个分片数据发送给后端,后端根据分片的下标和Size来往磁盘文件的不同位置写入分片数据,10个分片全部写完后即得到一个完整的文件。
前端的处理流程如下:
代码如下:
效果如下:
二.后端处理
后端接收到分片数据后,要根据分片的下标和分片的大小来往文件的指定位置写入分片数据。
例如:分片大小为1MB,第一个分片就要往文件的第0个字节开始,写入1048576字节的数据。第二个分片就要往文件的第1048576个字节开始,写入1048576字节的数据,以此类推。待所有的分片数据全部写入完成后,即得到一个完整的文件。
后端处理流程如下:
分片数据的写入,需要对文件进行定位,移动访问指针。
JDK提供了java.io.RandomAccessFile类,支持对文件进行随机的读写操作。
在Linux平台上,所有打开的文件都有一个文件描述符(FD),文件描述符自身维护了一个文件偏移量(current file offset),简称cfo,通过lseek函数可以移动文件的读写指针,RandomAccessFile的seek()方法就是调用了Linux的lseek系统函数来实现的。
通过RandomAccessFile.seek()移动访问指针,然后写入分片数据。
后端处理代码如下:
三.执行效果
用户选择文件上传:
服务器接收并且完成分片的组装后,会保存文件,并且提示success:
接收文件保存在temp文件夹中:
小结:
这部分我主要进行了网页版的分片上传和服务器的接收。和孙一凡同学进行安卓和服务器的联调。实现视频稳定上传。李文文,方新月,刘凯分别负责视频摘要,人脸识别,场景划分。
因为我也是初次进行一个较大的项目的开发工作,在前期不能立马确定下来整个项目的完整的架构,在这部分我是增量开发,逐步将各个同学的工作汇集在一起,希望可以顺利完成项目。
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
