soket.io


断点续传综述

  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值,调用函数

工作人员

 
                    
作者:XXX
信息录入:XXX
文案编辑:XXX
视频录制:XXX
视频编辑:XXX
图片编辑:XXX