# 分片上传 关于大文件分片上传的一些思考 ## 浏览器 ### 创建文件 `hash` - 创建文件的 `hash` 值。 - 提交上传文件基本数据和文件 `hash` 值。 - 如果存在的话,忽略本次文件上传;并将该文件路径指向用户服务器存储空间中。 当文件不存在或上传一部分文件数据时,进入下一流程。 ### 文件分片 - 访问服务器获取文件分片最大值。 - 通过循环切割文件,并创建每一个分片的 `hash` ### 文件上传 - 根据首次与服务器通信结果,判断是否为断点上传 - 如果是断点上传,判断断点位置, - 获取对应分片,以此分片为起点开始上传 ### 进度条 - 不论是断点还是首次上传文件,进度条为已传分片数除总分片数 --- ## 服务器 ### 检测文件 `hash` #### 数据库检测 `hash` 是否存在 存在 - 将该文件与用户传入文件基本信息结合 - 存入云空间 - 通知前端,文件秒传成功 --- 不存在或断点 - 创建临时上传空间(存在时间为最后断点上传后的 `24` 个小时或上传成功后) - 用户云盘数据中写入临时上传信息(存在时间为最后断点上传后的 `24` 个小时或上传成功后) - 如果是断点之后续传,告知前端最后一个分片 `hash` #### 文件上传 - 获取分片数据,存入临时上传空间 - 上传所有分片,合并分片,创建文件 hash,与文件原 hash 比对 - hash 不一致,告知用户上传失败 - hash 确认无误,放入用户云盘中 - 清理数据