Up云网盘
致力于打造蓝奏云一样的业界良心网盘
大文件上传
文件合并RandomAccessFile
大文件下载
线程池有五种
- newCachedThreadPool
- newFixedThreadPool
- newSingleThreadExecutor
- newScheduleThreadPool
- newSingleThreadScheduledExecutor
文件下载是I/O密集型
使用了Executors.newFixedThreadPool(DOWNLOAD_THREAD_NUM + 1)来创建一个固定大小的线程池,用于管理下载任务和日志线程。这种方式确保了线程的复用,并且能够有效地控制线程的数量。
后端给文件进行分片
断点续传
temp文件夹下创建一个文件夹,命名为文件的md5值
然后给分片按照从0开始命名
下载进度通过已经上传的文件分片数除以总分片数
秒传
上传的文件设定一个md5值
然后在fileInfo表中查询file_md5如果存在返回file_path
当然就会问了:md5值会发生碰撞,因为md5值是通过文件中随机采样再进行运算的非对称加密形式.但是有很小概率发生多个文件的md5值相同的情况,这样的话可以同时对文件进行md5加密为A值和sha-1加密为B值,然后对AB进行拼接加密为C最后保存C.
设置一个阈值例如256KB,如果文件大小小于256KB就不会进行触发秒传,如果文件大小大于256KB那么此时截取文件大小前256KB的MD5值,以及取整个文件的MD5值,再获取文件大小size
文件预览
通过第三方的应用ffmepg进行处理
视频的预览ffmepg会通过对视频文件分片.ts文件和生成.m3u8的索引文件,这样做的好处是,不需要将大量的数据加载到本地,在进行拉取进度条的时候从索引文件中读取然后加载相应的视频文件,加快了缓冲的时间,要不然不分片的情况下预览视频是需要对整个视频文件进行缓存,时间久,内存消耗大,用户的体验不佳.
其他word,txt,pdf我是用的openOffice的接口进行预览的,一开始我是通过对这些文件通过数据流的形式进行解析到前端,然后我发现有什么问题呢,就是有一个pdf文件大概有100多MB好几百页,然后通过数据流的形式,直接浏览器无响应,然后浏览器OOM了,之后我就通过调用别人封装的接口进行预览,这就强在java的生态好
文件通过web链接分享
文件夹系统
目录也是文件,存放在fileInfo中,每一个文件有一个唯一ID值,和FilePid,当我点击AAA文件夹的时候查询哪些文件的filePid值和AAA的file_id相等然后展示出来就行,每次进入一个文件夹的时候进行遍历
移动目录文件的时候比如将BBB 文件目录的所有文件移动到AAA目录下也只需要改变BBB目录的filepid值