欢迎来到天天文库
浏览记录
ID:37239615
大小:84.46 KB
页数:8页
时间:2019-05-20
《HTTP断点续传 上传功能》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、由于业务需要,手机需要采用http方式传输文件到后台WEB服务器,1、2百K的小文件不会有太大问题,几M甚至几百M的文件就很容易传输失败。所以考虑实现HTTP文件断点续传功能,基本流程如下:1.客户端计算本地要上传的文件的hashcode2.根据指定的块大小和文件大小计算最终的块数3.发送文件信息到服务器包括要上传的文件名、大小、类型、块数、Hashcode4.服务器根据hashcode查询服务器上是否已经存在对应的文件,以及文件的上传状态(上传是否完成、是否组装完成、已经上传了哪些块)5.6.已经上传完成的读取文件URL地址返回给客户端7.8.未上传完成的
2、返回已经上传的块编号9.客户端根据返回值判断,如果未上传完成则从本地文件中读取未上传完成的块内容10.使用HTTP方式上传到服务器11.记录已经上传完成的块到数据库12.检查整个文件是否已经上传完成13.未完成则返回已经上传的块编号到客户端让它继续上传14.上传完成则进行块文件合并过程,将其合并成目标文件15.合并完成后返回目标文件的URL地址首先是数据库表格:createtabletb_fileupload(fseqintprimarykeyauto_increment,#自增序列fusernamevarchar(50),#上传者fhashcodevarc
3、har(100),#hash码fsizeint,#文件大小fblocksint,#块数ftypevarchar(50),#文件类型freadyvarchar(1024),#已上传完成的块编号finerpathvarchar(200),#内部存储路径fouterpathvarchar(200),#外部存储路径fisfinishedintdefault0,#要否上传完成ftimedatetime#创建时间)接下来是客户端代码:importjava.io.FileInputStream;publicclassAuth{publicstaticbyte[]creat
4、e(Stringfilename)throwsExcepiton{InputStreamfis=newFileInputStream(filename);byte[]buf=newbyte[1024];MessageDigestcom=MessageDigest.getInstance("MD5");intnum;do{num=fis.read(buf);if(num>0){com.update(buf,0,num);}}while(num!=-1)fis.close();returncom.digest();}publicstaticStringgetMD
5、5(Stringfilename)throwException{byte[]b=create(filename);Stringresult="";for(inti=0;i6、hashcode查找FileInfoinfo=fileSer.getFileByHash(hashcode);if(info==null){}//找不到则新增文件信息fileSer.saveFileInfo(username,filename,filesize,hashcode,blocks,filetype);return"added";}if(info.fisfinished){//如果已经上传完毕则返回外部访问路径returninfo.fouterpath;}else{//未上传完毕则返回已经上传的块returninfo.fready;})2:priv7、ateFileblock;publicvoidsaveblock(){if([这里验证与块一起上传的block信息]){return"error";}FileInfoinfo=fileSer.getFileByHash(hashcode);if(info!=null){if(info.fisfinished){//如果已经上传完毕则返回外部访问路径returninfo.fouterpath;}FileInputStreaminStream=newFileInputStream(block);FileOutputStreamoutStream=newFileO8、utputStream(block存储路径+hash
6、hashcode查找FileInfoinfo=fileSer.getFileByHash(hashcode);if(info==null){}//找不到则新增文件信息fileSer.saveFileInfo(username,filename,filesize,hashcode,blocks,filetype);return"added";}if(info.fisfinished){//如果已经上传完毕则返回外部访问路径returninfo.fouterpath;}else{//未上传完毕则返回已经上传的块returninfo.fready;})2:priv
7、ateFileblock;publicvoidsaveblock(){if([这里验证与块一起上传的block信息]){return"error";}FileInfoinfo=fileSer.getFileByHash(hashcode);if(info!=null){if(info.fisfinished){//如果已经上传完毕则返回外部访问路径returninfo.fouterpath;}FileInputStreaminStream=newFileInputStream(block);FileOutputStreamoutStream=newFileO
8、utputStream(block存储路径+hash
此文档下载收益归作者所有