3.easypan-文件预览

3.0 遇到的问题

  1. 找不到本地文件,原因是没有拼接默认的目录。。。

  2. 还是找不到,原因是只拼接了默认根目录,没拼接 file

  3. 出现了多次由于文件路径拼接不当导致的 bug

  4. 出现了由于前期分割 ts 文件,名称设置不当导致的查找不到资源问题

  5. 好吧,前端也有错的,前端关于创建文件夹模块,传参父目录那里错了,没有获取正确值

3.1 获取缩略图

  1. 前端传来图像文件夹路径和图像名称

  2. 先拼接图像文件的完整路径

  3. 然后走 readFile 方法,传入 response 和文件的路径

  4. 这里设置了图片缓存时间为 2592000s,也设置了响应类型

  5. 读取本地文件流程:

    • 创建文件对象

    • 检查文件是否存在

    • 创建文件输入流,每次读 1KB

    • 获取响应 response 的输出流,循环读取文件并写入响应输出流

    • 刷新输出流,确保所有数据都被写入

    • 关闭流

3.2 文件预览

文件的预览其实就是把文件从存储磁盘中取出来,发送给前端。而在这个过程中,我们要区分当前预览的是视频还是其他文件。因为:如果是文件的话,我们就需要先发送 m3u8 文件,然后根据需要选择发送哪一个 ts 视频文件。

预览。ts 处理方案:

  1. 根据源文件的 id 查询出一个文件集合,可能是分享的视频,直接根据 fileId 查视频文件,然后获取这个 file 信息

  2. 如果没有这个视频文件就直接返回

  3. 根据当前用户 id 和视频路径去查询是否有该文件

  4. 构建。ts 文件路径

非视频文件预览:

  1. 直接根据文件 id 和用户 id 查询文件信息

  2. 视频文件读取。m3u8 文件,非视频文件直接获取 filePath

统一处理:

读取本地文件

3.3 新建文件夹

文件夹管理和文件管理在一个表 file_info 中,有一个字段 folder_type 标识该数据是文件夹还是文件

接口层获取到用户信息之后,进入 service 层中,调用 newFolder 方法创建文件夹,整个 newFolder 可以分为三个板块

  1. 查询是否有同名文件夹

  2. 构造文件夹类,插入数据库

  3. 检查当前文件夹是否重名,如果重名就回滚

其实这里我们连续检查了两次是否存在同名,就是为了防止并发条件下多线程会创建相同名称的文件夹

3.4 获取文件夹信息

前端点击一个文件夹进入其内部时会先请求该文件夹的信息

  1. 首先前端会传入父文件夹名称,根据 filePid+userId 查询文件夹信息

  2. 这里的 sql 是获取多层级的文件夹信息,有排序,保证获取的文件多级目录顺序正确用于前端展示

3.4 文件重命名

文件重命名也是可以分为三部分:

  1. 检查当前文件是否存在以及文件要更新的名称是否就是文件当前名称

  2. 构造文件类来在表中更新文件名称

  3. 检查是否有重名文件

3.5 移动文件

移动文件是指让文件或文件夹可以在不同的层级中移动。而移动文件的逻辑可以分为四部分

  1. 检查当前文件如何移动(自己不能移动到自己的文件夹里面),并且不能往已经被删除的文件夹中移动

  2. 检查当前待移动的文件夹或者文件是否与目标文件夹中的文件夹或文件命名重复。

  3. 如果发生重复的话,在重复的两个文件中选择一个重命名

  4. 更新待移动的文件夹或文件的父级文件夹