java的http断点续传原理(二)
用Java实现断点续传(HTTP)

⽤Java实现断点续传(HTTP)在web项⽬中上传⽂件夹现在已经成为了⼀个主流的需求。
在OA,或者企业ERP系统中都有类似的需求。
上传⽂件夹并且保留层级结构能够对⽤户⾏成很好的引导,⽤户使⽤起来也更⽅便。
能够提供更⾼级的应⽤⽀撑。
数据表结构⽂件⽂件夹数据表结构⽂件数据表结构该项⽬核⼼就是⽂件分块上传。
前后端要⾼度配合,需要双⽅约定好⼀些数据,才能完成⼤⽂件分块,我们在项⽬中要重点解决的以下问题。
* 如何分⽚;* 如何合成⼀个⽂件;* 中断了从哪个分⽚开始。
如何分,利⽤强⼤的js库,来减轻我们的⼯作,市场上已经能有关于⼤⽂件分块的轮⼦,虽然程序员的天性曾迫使我重新造轮⼦。
但是因为时间的关系还有⼯作的关系,我只能罢休了。
最后我选择了百度的WebUploader来实现前端所需。
如何合,在合之前,我们还得先解决⼀个问题,我们如何区分分块所属那个⽂件的。
刚开始的时候,我是采⽤了前端⽣成了唯⼀uuid来做⽂件的标志,在每个分⽚请求上带上。
不过后来在做秒传的时候我放弃了,采⽤了Md5来维护分块和⽂件关系。
在服务端合并⽂件,和记录分块的问题,在这⽅⾯其实⾏业已经给了很好的解决⽅案了。
参考迅雷,你会发现,每次下载中的时候,都会有两个⽂件,⼀个⽂件主体,另外⼀个就是⽂件临时⽂件,临时⽂件存储着每个分块对应字节位的状态。
⽂件夹准备逻辑这些都是需要前后端密切联系才能做好,前端需要根据固定⼤⼩对⽂件进⾏分⽚,并且请求中要带上分⽚序号和⼤⼩。
前端发送请求顺利到达后台后,服务器只需要按照请求数据中给的分⽚序号和每⽚分块⼤⼩(分⽚⼤⼩是固定且⼀样的)算出开始位置,与读取到的⽂件⽚段数据,写⼊⽂件即可。
为了便于开发,我将服务端的业务逻辑进⾏了如下划分,分成初始化,块处理,⽂件上传完毕等。
服务端的业务逻辑模块如下功能分析:⽂件夹⽣成模块⽂件夹上传完毕后由服务端进⾏扫描代码如下初始化⽂件的逻辑初始化⽂件夹的逻辑保存⽂件(将⽂件信息写⼊到数据库)逻辑写⼊⽂件夹的逻辑分块上传,分块处理逻辑应该是最简单的逻辑了,up6已经将⽂件进⾏了分块,并且对每个分块数据进⾏了标识,这些标识包括⽂件块的索引,⼤⼩,偏移,⽂件MD5,⽂件块MD5(需要开启)等信息,服务端在接收这些信息后便可以⾮常⽅便的进⾏处理了。
用Java实现HTTP断点续传功能(副附详细的源代码)

用Java实现HTTP断点续传功能.2007年06月25日星期一16:13(一)断点续传的原理其实断点续传的原理很简单,就是在Http的请求上和一般的下载有所不同而已。
打个比方,浏览器请求服务器上的一个文时,所发出的请求如下:假设服务器域名为,文件名为down.zip。
GET /down.zip HTTP/1.1Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/msword, application/vnd.ms-powerpoint, */*Accept-Language: zh-cnAccept-Encoding: gzip, deflateUser-Agent: Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)Connection: Keep-Alive服务器收到请求后,按要求寻找请求的文件,提取文件的信息,然后返回给浏览器,返回信息如下200Content-Length=106786028Accept-Ranges=bytesDate=Mon, 30 Apr 2001 12:56:11 GMTETag=W/"02ca57e173c11:95b"Content-Type=application/octet-streamServer=Microsoft-IIS/5.0Last-Modified=Mon, 30 Apr 2001 12:56:11 GMT所谓断点续传,也就是要从文件已经下载的地方开始继续下载。
所以在客户端浏览器传给Web服务器的时候要多加一条信息--从哪里开始(客户端提供一个文件偏移)。
下面是用自己编的一个"浏览器"来传递请求信息给Web服务器,要求从2000070字节开始。
http断点续传的原理

http断点续传的原理
——————————————先讲原理,如下:——————————————————
举⼀个详细的例⼦:
⼀般场景,要访问的域名:,⽂件名为down.zip
服务器到请求后,按要求寻找请求的⽂件,提取⽂件的信息,然后返回给浏览器,返回信息如下
好了。
现在讲解⼀下断点续传原理:
所谓断点续传,也就是要从⽂件已经下载的地⽅开始继续下载。
因此,在客户端,浏览器传给web服务器的时候要多加⼀条信息--从哪⾥开始。
⽐⽅说,“浏览器”来传递请求信息给服务器,要求从2000070字节开始:
range: bytes=2000070- 这个就是浏览器对服务器喊话:“喂!服务器,down.zip这个⽂件从2000070字节开始传过来!前⾯的字节不⽤传了哈~”
服务器说:“好嘞!您等着~”,返回如下(返回的代码也改为206了,⽽不再是200了):
——————————————原理到此结束——————————————————。
java断点续传原理与实现

java断点续传原理与实现Java的断点续传是一种实现大文件传输的技术,当传输过程中出现中断或者网络故障时,可以通过断点续传的机制,继续传输文件,而无需重新开始传输。
在传统的文件传输过程中,当文件传输失败时,重新传输整个文件是耗费时间和资源的。
而断点续传则通过记录传输的状态信息,使得在传输中断后可以从断点处继续传输,大大提高了传输效率。
断点续传的实现原理主要涉及到两个方面:状态信息记录和传输的恢复。
首先,要实现断点续传,我们需要记录传输过程的状态信息,包括文件的已传输大小、传输的起始位置等。
可以使用文件的元数据信息或者自定义的记录方式来实现。
这些状态信息通常会储存在服务器或者本地文件系统中。
其次,当传输中断后,需要根据之前记录的状态信息来恢复传输。
在Java中,可以通过读取之前保存的状态信息来确定传输的起始位置,然后从该位置处继续传输。
通过使用Java的文件输入输出流和字节流,可以实现断点续传功能。
具体实现中,可以使用Java的RandomAccessFile类来实现文件的读写操作。
通过设置文件的偏移量,可以从指定位置读取和写入数据。
这样,在断点续传时,我们只需要根据之前记录的起始位置,设置文件的偏移量,即可从断点处继续传输文件。
在实际应用中,我们可以将断点续传功能与HTTP协议结合使用,通过HTTP的Range请求头来实现断点续传功能。
在客户端发送请求时,可以通过设置Range头,指定文件传输的起始位置和结束位置。
服务器在接收到该请求后,根据指定的范围返回相应的文件片段。
这样,当传输中断后,客户端只需要再次发送带有Range头的请求,即可从中断处恢复传输。
总结起来,Java的断点续传通过记录传输状态信息和根据状态信息进行传输的恢复,实现了在传输中断后继续传输文件的功能。
通过合理运用Java的文件操作和网络传输技术,可以实现稳定高效的大文件传输,并在网络传输不稳定的情况下提供了更好的用户体验。
如果想要实现断点续传功能,可以按照上述原理和实现方法进行开发。
JAVA实现HTTP断点续传

JA V A实现HTTP断点续传(一)断点续传的原理其实断点续传的原理很简单,就是在Http的请求上和一般的下载有所不同而已。
打个比方,浏览器请求服务器上的一个文时,所发出的请求如下:假设服务器域名为,文件名为down.zip。
GET /down.zip HTTP/1.1Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/msword, application/vnd.ms-powerpoint, */*Accept-Language: zh-cnAccept-Encoding: gzip, deflateUser-Agent: Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)Connection: Keep-Alive服务器收到请求后,按要求寻找请求的文件,提取文件的信息,然后返回给浏览器,返回信息如下:200Content-Length=106786028Accept-Ranges=bytesDate=Mon, 30 Apr 2001 12:56:11 GMTETag=W/"02ca57e173c11:95b"Content-Type=application/octet-streamServer=Microsoft-IIS/5.0Last-Modified=Mon, 30 Apr 2001 12:56:11 GMT所谓断点续传,也就是要从文件已经下载的地方开始继续下载。
所以在客户端浏览器传给Web服务器的时候要多加一条信息--从哪里开始。
下面是用自己编的一个"浏览器"来传递请求信息给Web服务器,要求从2000070字节开始。
GET /down.zip HTTP/1.0User-Agent: NetFoxRANGE: bytes=2000070-Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2仔细看一下就会发现多了一行RANGE: bytes=2000070-;这一行的意思就是告诉服务器down.zip这个文件从2000070字节开始传,前面的字节不用传了。
断点续传方案

断点续传方案简介断点续传是指在网络传输过程中,当连接中断或者文件传输中止时,能够从中断处重新开始传输,而不是从头开始。
这样可以提高文件传输的可靠性和传输效率。
在实际应用中,断点续传方案常常用于大文件的上传或下载过程中,以确保用户在网络不稳定的情况下能够顺利完成文件传输,而无需重新开始。
本文将介绍几种常见的断点续传方案,并分析各种方案的优缺点,帮助读者选择适合自己应用场景的方案。
方案一:基于HTTP的断点续传HTTP协议是应用层协议中最常用的协议之一,支持断点续传的HTTP服务器通常会在响应头中添加Range字段,用于指定服务器传输的起始位置。
客户端在进行文件下载时,通过设置请求头中的Range字段来请求指定范围的数据。
服务器接收到请求后,根据Range字段返回相应的数据片段。
如果客户端在下载过程中中断,可以通过设置Range字段重新发送请求,从中断处继续下载。
HTTP的断点续传方案具有以下优点:-:基于HTTP的断点续传方案使用标准的HTTP协议,不需要额外的协议和框架支持,方便快捷。
-:基于HTTP的断点续传方案通常兼容多种操作系统和终端设备,使用广泛。
-:通过设置不同的Range字段,可以实现下载指定范围的数据,具有较高的灵活性。
-:HTTP协议本身就具有较高的可靠性,断点续传方案在一定程度上增强了文件传输的可靠性。
然而,基于HTTP的断点续传方案也存在一些局限性:-:由于每次续传都需要从中断处开始,可能会导致重复传输已经传输过的数据,降低传输效率。
-:对于非常大的文件,服务器需要保存大量的中断点信息,占用较多的磁盘空间和内存资源。
-:如果服务器不支持断点续传,那么即使客户端实现了断点续传方案,也无法成功续传。
方案二:基于FTP的断点续传FTP(File Transfer Protocol)是一种文件传输协议,也常用于文件上传和下载。
FTP支持断点续传的机制,能够在网络中断或传输中止后从中断处继续传输。
利用Http协议实现断点续传

利用Http协议实现断点续传利用Http协议实现断点续传朱爱梅摘要:本文介绍断点续传的原理和实现,并说明了如何利用Java语言通过Http协议实现断点续传功能的程序。
关键词:java;断点续传;序列化;流;Http协议;In ternet中图分类号:F123.16文献标识码:A文章编号:CN43-1027/F(2007)9-181-01作者:湖南科技职业学院软件学院;湖南,长沙,410006一、断点续传说明断点续传指当信号中断后(掉线或关机等),下次能够从上次中断地方开始接着传送(一般指下载或上传),不支持断点续传就意味着下次下载或上传必须从零开始,断点续传能提高下载的效率。
二、断点续传的实现。
11虽然断点续传的原理非常简单,但是在Internet上如何实现了?在Internet上,所有的连接都是无状态的,即当用户与服务器进行一次通信完成后,服务器将不再保留本次通信的状态与信息。
那么当文件从服务器下载到客户时,如果因为掉线或者关机,此时连接将被中断,下次开机后想继续下载,怎样才能恢复到上一次文件下载的位置了,如果不能恢复,则必须重新开始下载。
其实要解决这个问题也非常简单,通过对Http协议的分析后将会非常清楚。
21当客户与服务器在In ternet上通过Http协议进行联系时,客户首先向服务器发出请求,所发出的请求如下:假设服务器名为http://localhost/,请求的文件名为:mysite-2.rarGE T/mysite-2.rar HTTP/1.1Accep t:i mage/gif,i mage/x-xbitmap,image/jpeg,image/pjpeg,application/vnd.ms-excel,ap-plication/msword,application/vnd.ms-powerpoint,*/*Accep t-Language:zh-cn Accept-Encoding:gzip,deflate User-Agent: Mozilla/4.0(compatible;MSIE6.0;Windows NT5.0)Connection:Keep-Alive服务器收到请求后,按要求寻找请求的文件,提取文件的信息,然后返回给浏览器,返回信息如下: 200Content-Length=106786028Accept-Ranges=bytes Date= Wed,30May200711:56:11GMTETag=W//02ca57e173c11:95b0Content-Type=application/ octet-streamServer=Microsoft-IIS/6.0Last-Modified=Wed,30M ay 2007110:56:11GMT其中200表示连接正常。
java断点续传原理

java断点续传原理断点续传是指在网络传输过程中,当传输中断或失败后,能够从中断处继续传输,而不需要重新开始传输的一种技术。
在Java中实现断点续传主要依赖于HTTP协议和文件流操作。
HTTP协议是一种无连接的协议,每个请求和响应都是独立的。
当客户端发送请求时,服务器会返回一个状态码和文件的相关信息,如果状态码为206,则表示服务器支持部分内容传输,并返回相应的Content-Range头字段,用于指定从哪个字节到哪个字节的内容。
客户端根据这些信息可以知道文件已经传输到哪个位置,从而进行断点续传。
在Java中,可以使用URL类和HttpURLConnection类来实现HTTP连接和文件传输操作。
下面是一个简单的示例代码:```javaimport java.io.*;public class ResumeUploadExamplepublic static void main(String[] args)String savePath = "path/to/save/file";tryURL url = new URL(fileUrl);HttpURLConnection connection = (HttpURLConnection)url.openConnection(;File file = new File(savePath);long startPos = 0;if (file.exists()startPos = file.length(;connection.setRequestProperty("Range", "bytes=" + startPos + "-");}connection.connect(;int responseCode = connection.getResponseCode(;if (responseCode == HttpURLConnection.HTTP_PARTIAL)long contentLength = connection.getContentLengthLong(;InputStream inputStream = connection.getInputStream(;RandomAccessFile outputFile = new RandomAccessFile(file, "rw");outputFile.seek(startPos);byte[] buffer = new byte[1024];int bytesRead;while ((bytesRead = inputStream.read(buffer)) != -1)outputFile.write(buffer, 0, bytesRead);}outputFile.close(;inputStream.close(;System.out.println("File downloaded successfully!");} elseSystem.out.println("Server does not support resume!");}} catch (IOException e)e.printStackTrace(;}}```在上述代码中,首先创建URL对象并打开HTTP连接。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
java的http断点续传原理(二)//获得文件长度public long getFileSize(){int nFileLength = -1;try{URL url = new URL(siteInfoBean.getSSiteURL());HttpURLConnection httpConnection = (HttpURLConnection)url.openConnection (); httpConnection.setRequestProperty("User-Agent","NetFox");int responseCode=httpConnection.getResponseCode();if(responseCode>=400){processErrorCode(responseCode);return -2; //-2 represent access is error}String sHeader;for(int i=1;;i++){//DataInputStream in = new DataInputStream(httpConnection.getInputStream ()); //Utility.log(in.readLine());sHeader=httpConnection.getHeaderFieldKey(i);if(sHeader!=null){if(sHeader.equals("Content-Length")){nFileLength = Integer.parseInt(httpConnection.getHeaderField(sHeader)); break;}}elsebreak;}}catch(IOException e){e.printStackTrace ();}catch(Exception e){e.printStackTrace ();}Utility.log(nFileLength);return nFileLength;}//保存下载信息(文件指针位置)private void write_nPos(){try{output = new DataOutputStream(new FileOutputStream(tmpFile));output.writeInt(nStartPos.length);for(int i=0;i< p>{// output.writeLong(nPos[i]);output.writeLong(fileSplitterFetch[i].nStartPos);output.writeLong(fileSplitterFetch[i].nEndPos);}output.close();}catch(IOException e){e.printStackTrace ();}catch(Exception e){e.printStackTrace ();}}//读取保存的下载信息(文件指针位置)private void read_nPos(){try{DataInputStream input = new DataInputStream(new FileInputStream(tmpFile)); int nCount = input.readInt();nStartPos = new long[nCount];nEndPos = new long[nCount];for(int i=0;i< p>{nStartPos[i] = input.readLong();nEndPos[i] = input.readLong();}input.close();}catch(IOException e){e.printStackTrace ();}catch(Exception e){e.printStackTrace ();}}private void processErrorCode(int nErrorCode) {System.err.println("Error Code : " + nErrorCode); }//停止文件下载public void siteStop(){bStop = true;for(int i=0;i< p>fileSplitterFetch[i].splitterStop();}}/***FileSplitterFetch.java*/package NetFox;import java.io.*;import .*;public class FileSplitterFetch extends Thread {String sURL; //File URLlong nStartPos; //File Snippet Start Positionlong nEndPos; //File Snippet End Positionint nThreadID; //Thread's IDboolean bDownOver = false; //Downing is overboolean bStop = false; //Stop identicalFileAccessI fileAccessI = null; //File Access interfacepublic FileSplitterFetch(String sURL,String sName,long nStart,long nEnd,int id) throws IOException{this.sURL = sURL;this.nStartPos = nStart;this.nEndPos = nEnd;nThreadID = id;fileAccessI = new FileAccessI(sName,nStartPos);}public void run(){while(nStartPos < nEndPos && !bStop){try{URL url = new URL(sURL);HttpURLConnection httpConnection = (HttpURLConnection)url.openConnection ();httpConnection.setRequestProperty("User-Agent","NetFox");String sProperty = "bytes="+nStartPos+"-";httpConnection.setRequestProperty("RANGE",sProperty);Utility.log(sProperty);InputStream input = httpConnection.getInputStream();//logResponseHead(httpConnection);byte[] b = new byte[1024];int nRead;while((nRead=input.read(b,0,1024)) > 0 && nStartPos < nEndPos && !bStop) {nStartPos += fileAccessI.write(b,0,nRead);//if(nThreadID == 1)// Utility.log("nStartPos = " + nStartPos + ", nEndPos = " + nEndPos); }Utility.log("Thread " + nThreadID + " is over!");bDownOver = true;//nPos = fileAccessI.write (b,0,nRead);}catch(Exception e){e.printStackTrace ();}}}//打印回应的头信息public void logResponseHead(HttpURLConnection con){for(int i=1;;i++){String header=con.getHeaderFieldKey(i);if(header!=null)//responseHeaders.put(header,httpConnection.getHeaderField(header)); Utility.log(header+" : "+con.getHeaderField(header));elsebreak;}}public void splitterStop(){bStop = true;}}/***FileAccess.java*/package NetFox;import java.io.*;public class FileAccessI implements Serializable{ RandomAccessFile oSavedFile;long nPos;public FileAccessI() throws IOException{this("",0);}public FileAccessI(String sName,long nPos) throws IOException {oSavedFile = new RandomAccessFile(sName,"rw");this.nPos = nPos;oSavedFile.seek(nPos);}public synchronized int write(byte[] b,int nStart,int nLen) {int n = -1;try{oSavedFile.write(b,nStart,nLen);n = nLen;}catch(IOException e){e.printStackTrace ();}return n;}}/***SiteInfoBean.java*/package NetFox;public class SiteInfoBean {private String sSiteURL; //Site's URLprivate String sFilePath; //Saved File's Pathprivate String sFileName; //Saved File's Nameprivate int nSplitter; //Count of Splited Downloading Filepublic SiteInfoBean(){//default value of nSplitter is 5this("","","",5);}public SiteInfoBean(String sURL,String sPath,String sName,int nSpiltter) {sSiteURL= sURL;sFilePath = sPath;sFileName = sName;this.nSplitter = nSpiltter;}public String getSSiteURL(){return sSiteURL;}public void setSSiteURL(String value) {sSiteURL = value;}public String getSFilePath(){return sFilePath;}public void setSFilePath(String value) {sFilePath = value;}public String getSFileName(){return sFileName;}public void setSFileName(String value) {sFileName = value;}public int getNSplitter(){return nSplitter;}public void setNSplitter(int nCount) {nSplitter = nCount;}}/***Utility.java*/package NetFox;public class Utility {public Utility(){}public static void sleep(int nSecond) {try{Thread.sleep(nSecond);}catch(Exception e){e.printStackTrace ();}}public static void log(String sMsg){System.err.println(sMsg);}public static void log(int sMsg){System.err.println(sMsg);}}/***TestMethod.java*/package NetFox;public class TestMethod {public TestMethod(){ ///xx/weblogic60b2_win.exetry{SiteInfoBean bean = newSiteInfoBean("http://localhost/xx/weblogic60b2_win.exe","L:\\temp","weblogic60b2_w in.exe",5);//SiteInfoBean bean = newSiteInfoBean("http://localhost:8080/down.zip","L:\\temp","weblogic60b2_win.exe",5) ;SiteFileFetch fileFetch = new SiteFileFetch(bean);fileFetch.start();}catch(Exception e){e.printStackTrace ();}}public static void main(String[] args){new TestMethod();。