断点续传综述
nodejs常用的处理文件上传的开源组件有multer、formidable等,前期可以借助这两个开源组件,实现断点续传。
断点续传流程整理
断点续传数据结构:
文件id 文件服务器名 文件显示名 文件hash值 文件大小 引用计数 上传时间
FileId FileServerName FileName Hash FileSize RefCount UploadTime
1、前端对文件进行hash,把hash值发送到数据库查询是否已经有人上传了该文件,如果已经上传,则返回该文件信息,引用计数加一。没有该文件,则执行第二步
2、前端分割文件,向后端发送数据
3、后端接收到第一段数据时就生成文件,并向数据库插入数据,在此处插入数据,可以,避免2个用户同时上传一个文件。
4、后端接收到第2..n-1段数据时,直接追加到上一步创建的文件中,同时删除该上传临时片段
5、建议不做此步骤,可选,如果考虑两个用户同时上传文件的情况,数据结构需要保存在内存一份。当执行完第四步时,更新内存文件大小,避免重复更新数据库,此处比较复杂,可以暂时不考虑。
6、接收到最后一段时提示完成。
注:此方案暂未考虑用户多线程同时传递多个文件。
断点续传流程图一,第一次绘制
找学生讨论后,断点续传流程图二
找学生讨论后,断点续传流程图三,最终版
上传流程:
1、上传之前调用计算hash的函数,去数据库判断是否存在该文件。如果不存在该文件,则执行第二步骤,并得到(文件真实名、文件大小,文件hash) 会向服务器发请求
计算hash的代码如下:
var _filestream=File.read(); //File为input.files[0]
var _hash=U.E.CryptoJS.enc.Latin1.parse(_filestream);
//根据hash值去数据库查看是否已经存在该文件
U.A.Request(US.AUTH, ["GetFileByHash","ac948377cfbef488d80930b6c267ad7f","125560","jpg"], function(r){
if(r.value!="false"){
//表示已经存在该文件
}
});
2、调用上传接口上传文件.(制作此接口的同学只负责上传文件,断点续传,进度条),可以使用任何语言。 //会向服务器发请求,要求得到 "文件服务器名" ,如果是图片,要求得到"服务器缩略图名"
3、上传成功后,提交数据库, 拼凑上传信息: 需要提供一个函数
文件id Guid.newGuid();
用户id
目录id
1、如果是硬盘,则为硬盘目录id.
2、如果是头像, 则为为硬盘目录里面的临时目录id/我的头像.
背景,临时目录id/我的背景
聊天,临时目录id/临时图片
发帖,临时目录id/临时图片
文件真实名
文件服务器名
文件服务器缩略图名
文件大小
文件hash值
文件描述
文件后缀名
文件加密密码
fileid, userid, directoryid, Path.GetFileName(filename), fileinfo["UserFilesServerName"], fileinfo["UseFilesServerThumbnailName"], fileinfo["UserFilesSize"], 0, fileinfo["UserFilesID"].ToString(), filedescript, Path.GetExtension(filename).Trim('.'), encrypt;
4、该视频是否要有缩略图,如果要缩略图,调用生成缩略图的函数。需要提供一个函数
流程图说明:
1、得到上传文件Hash值,调用函数