断点续传主要是使用http协议中range的属性来取得资源的部分内容,由于一般服务是不对外直接提供url访问的,一般都是通过id,在servlet中输出byte[]来实现,所以要想实现断点续传一般要自己实现一个服务端。
一个简单实现:
服务端:主要是分析了range属性,利用RandomAccessFile读取内容输出字节流
public class Download extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
int id = Integer.parseInt(req.getParameter("id"));
String filename ;
if (id == 1)
filename = "E:/JDK_API_1_5_zh_CN.CHM";
else if (id == 2)
filename = "E;/JDK_API_1_6_zh_CN.CHM";
else if (id == 3)
filename = "E:/apache-tomcat-5.5.26/webapps/ROOT/tomcat.gif";
else
filename = "c.rar";
RandomAccessFile raFile = new RandomAccessFile(filename, "r");
String range = req.getHeader("RANGE");
int start=0, end=0;
if(null!=range && range.startsWith("bytes=")){
String[] values =range.split("=")[1].split("-");
start = Integer.parseInt(values[0]);
end = Integer.parseInt(values[1]);
}
int requestSize=0;
if(end!=0 && end > start){
requestSize = end - start + 1;
resp.addHeader("content-length", ""+(requestSize));
} else {
requestSize = Integer.MAX_VALUE;
}
byte[] buffer = new byte[4096];
resp.setContentType("application/x-download");
resp.addHeader("Content-Disposition", "attachment;filename=a.chm");
ServletOutputStream os = resp.getOutputStream();
int needSize = requestSize;
raFile.seek(start);
while(needSize > 0){
int len = raFile.read(buffer);
if(needSize < buffer.length){
os.write(buffer,0,needSize);
} else {
os.write(buffer,0,len);
if(len < buffer.length){
break;
}
}
needSize -= buffer.length;
}
raFile.close();
os.close();
}
}
客户端:分两次取得部分内容,输出到RandomAccessFile中
public static void main(String[] args) throws MalformedURLException, FileNotFoundException {
test1(0,1000);
test1(1001,0);
}
public static void test1(int start, int end) throws MalformedURLException, FileNotFoundException{
String endpoint = "http://localhost:8080/Hello/download?id=1";
RandomAccessFile raFile = new RandomAccessFile("E:/temp/test.chm", "rw");
URL url = new URL(endpoint);
try {
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
//conn.addRequestProperty("location", "/tomcat.gif");
conn.setRequestProperty("Content-Type","text/html; charset=UTF-8");
conn.setRequestProperty("RANGE","bytes="+start+"-"+end);
conn.connect();
System.out.println(conn.getResponseCode());
System.out.println(conn.getContentLength());
System.out.println(conn.getContentType());
InputStream ins = (InputStream)conn.getContent();
raFile.seek(start);
byte[] buffer = new byte[4096];
int len = -1;
while((len = ins.read(buffer))!=-1){
raFile.write(buffer,0,len);
}
raFile.close();
conn.disconnect();
} catch (IOException e) {
e.printStackTrace();
}
}
接下来的工作:实现客户端的并发,多线程,即多个下载任务同时进行,连接的复用,实现暂停,显示进度条,下载完成的事件处理等,不涉及具体业务,搭建整个架构。
分享到:
相关推荐
断点续传内核的实现 主要用了 6 个类,包括一个测试类。 SiteFileFetch.java 负责整个文件的抓取,控制内部线程 (FileSplitterFetch 类 )。 FileSplitterFetch.java 负责部分文件的抓取。 FileAccess.java 负责...
NULL 博文链接:https://samttsch.iteye.com/blog/1109994
NULL 博文链接:https://samttsch.iteye.com/blog/1109588
java中http断点续传的实现原理,介绍了主要方法和简单的实现
用Java实现断点续传,其实断点续传的原理很简单,就是在Http的请求上和一般的下载有所不同而已。
在下载管理器中实现多线程下载的逻辑,包括文件分块、断点续传等功能。 使用线程池来管理下载任务的线程,可以提高线程的复用性和效率。 在下载过程中处理线程同步和资源释放,确保线程安全性和资源的正确释放。 ...
最近在做一个下载文件的功能的时候,因为要支持断点续传,虽然整体上思路很清晰,也比较简单,但是在做的过程中还是遇到了几个坑,特意在此记录一下,也重新梳理下下载断点续传的实现过程。 一、要注意的地方 这里先...
主要以实例的方式为大家详细介绍了简单的Java断点续传实现原理,感兴趣的小伙伴们可以参考一下
其实断点续传的原理很简单,就是在Http的请求上和一般的下载有所不同而已,本文将详细介绍Java如何实现HTTP断点续传功能,需要的朋友可以参考下
基于Java的的文件图片上传-分片上传-断点续传-秒传java源码.zip 1.主要功能经测试支持IE9以上,Chrome,FireFox;其他浏览器未测试; 2.文件上传部分:主要实现了文件的上传,进度条,多文件一起上传,上传前删除,...
这是我java的课程设计。本程序实现类似迅雷的多线程断点续传下载功能,并且有简单的界面,可以显示下载中各个线程的下载状况。 用Eclipse编译一下就能运行了。希望和大家共同学习!
用 Java 实现断点续传 (HTTP) 断点续传的原理 其实断点续传的原理很简单,就是在 Http 的请求上和一般的下载有所不同而已。
Java多线程与线程安全实践-基于Http协议的断点续传.rar 是一个Java毕业设计项目,旨在探讨如何在Java中实现多线程和线程安全,以及如何基于Http协议实现断点续传功能。该项目提供了一个完整的源代码包,可以作为学习...
SpringBoot + amazon-s3 实现切片上传、断点续传、秒传 功能(简单实现)
完整实现minio分片上传、断点续传、秒传等功能源码.zip 完整实现minio分片上传、断点续传、秒传等功能。 此方案有如下特点: 1、不暴露minio敏感信息 2、针对文件每一个分片生成相应的上传地址 3、文件直接从浏览器...
Java是一种面向对象的编程语言,它具有安全、可靠、简单、高效、跨平台等特点,被广泛应用于各种类型的应用程序开发。Java程序由Java源代码编写,经过编译后生成Java字节码文件,然后在Java虚拟机上运行。 Java程序...
4. HTTP协议的Range请求和Content-Range响应配合才能完成分段下载或断点续传,当然这需要服务器的支持,在核心代码有检测; 5. 使用了RandomAccessFile类对文件进行了随机读写; 6. 对HTTP数据流的读取做了简单的...
从简单性、可测试性和松耦合性角度而言,绝大部分Java应用都可以从Spring中受益。 JSP将Java代码和特定变动内容嵌入到静态的页面中,实现以静态页面为模板,动态生成其中的部分内容。JSP引入了被称为“JSP动作”的...
这里我自己也使用AsyncTask也实现了简单的断点续传的功能。 首先说一说AsyncTask吧,先来看看AsyncTask的定义: public abstract class AsyncTask<Params> 三种泛型类型分别代表“启动任务执行的输入参数”、...