HTTP断点续传 上传功能

由于业务需要,手机需要采用http方式传输文件到后台WEB服务器,1、2百K的小文件 不会有太大问题,几M甚至几百M的文件就很容易传输失败所以考虑实现HTTP文件断点续传功能,基本流程如下:DB<芫上传旳块文件■14:合15返回己上倍文件URL3返回般劳器上己上传的块编号7.耒上传冗成12检查切上待是否完成 13返回已上传的块编号2根据块坨h和丈件丈小计算总块数-3:发送要上倩的文件参数信息4:根抵芯£ha血检查文件陶上传If況 ” *<-…一一…仝已土墜感9读取朱上传完成的块H——'10:发迭未上传旳块抵返回C上传文件URL■11:记录己上传块WebServer1.获取要應输文件的I■怕shcodeI——I::liont1.客户端计算本地要上传的文件的hashcode 2.根据指定的块大小和文件大小计算最终的块数3•发送文件信息到服务器包括要上传的文件名、大小、类型、块数、Hashcode4•服务器根据hashcode查询服务器上是否已经存在对应的文件,以及文件的上传状态(上传是否完成、是否组装完成、已经上传了哪些块)5.6.已经上传完成的读取文件URL地址返回给客户端 7.8.未上传完成的返回已经上传的块编号9•客户端根据返回值判断,如果未上传完成则从本地文件中读取未上传完成的块内容10. 使用HTTP方式上传到服务器11. 记录已经上传完成的块到数据库12. 检查整个文件是否已经上传完成13. 未完成则返回已经上传的块编号到客户端让它继续上传14. 上传完成则进行块文件合并过程,将其合并成目标文件15. 合并完成后返回目标文件的URL地址首先是数据库表格:createtabletb_fileupload(fseqintprimarykeyauto_increment, # 自增序歹Ufusernamevarchar (),#上传者fhashcodevarchar(100), #hash码fsizeint, #文件大小fblocksint, # 块数ftypevarchar (50), #文件类型freadyvarchar(1024), #已上传完成的块编号finerpathvarchar(200), # 内部存储路径fouterpathvarchar (200), #外部存储路径fisfinishedintdefault0, # 要否上传完成5 —接下来是客户端代码:importjava.io.FileInputStream;publicclassAuth{publicstaticbyte[] create(String filename) throwsExcepiton{InputStreamfis = newFilelnputStream(filename);byte[] buf= newbyte[1024];MessageDigest com=MessageDigest.getInstance("MD5");intnum;do {num=fis.read(buf);if(num>0){}while(num!=-1)fis.close();亠u""ipublicstatic String getMD5(String filename) throw Exception {byte[] b =create(filename);String result="";for(inti=0;i 2•接收文件的各个块3•合并块1:privateFileServicefileSerpublicvoidsaveFileInfo(){//先从数据库中根据hashcode查找FileInfo info= fileSer.getFileByHash(hashcode); if(info==null){}//找不到则新增文件信息 fileSer.saveFileInfo(username,filename,filesize,hashcode,blocks,filetype);}……if(info.fisfinished){//如果已经上传完毕则返回外部访问路径 returninfo.fouterpath;else{//未上传完毕则返回已经上传的块 returninfo.fready;private File block;publicvoidsaveblock(){if([这里验证与块一起上传的block信息]){return "error";e)if(info!=null){ if(info.fisfinished){//如果已经上传完毕则返回外部访问路径:ninfo.~FileInputStreaminStream = new FilelnputStream(block);FileOutputStreamoutStream = new FileOutputStream(block 存储路径+hashcode+block 编号);intlen=-1;byte[]buff= new byte[1024];while((len=inStream.read(buff))!=-1){ou„_‘outStream.flush();outStream.close();//更新数据库中已经上传的blocks信息fileSer.updateBlocks(hashcode,num);//进行合并检查}n;3:public String uion(){ intnum =info.getFblocks();if(info.fisfinished){return info.fouterpah();}//这里要检查下上传的块数量是否与num 一致try{FileOutputStreamoutStream = new FileOutputStream(文件存储路径+info.ffilename); File inputfile=null;for(inti=1;i