最近写的一个断点下载功能代码,支持迅雷,旋风,IE等下载。迅雷、旋风测试正常,代码如下:
request.setCharacterEncoding("UTF-8");
String primary = request.getParameter("primary");
String uid = request.getParameter("uid");
String timestamp = request.getParameter("timestamp");
String verify = request.getParameter("verify");
//校验下载权限
String verify_n = MD5.md5(uid + primary + "lyjilu" + timestamp);
if (!verify_n.equals(verify)) {
response.sendError(HttpServletResponse.SC_NOT_FOUND);
return;
}
response.reset();
String filePath = ZipAssist.getZipPath(primary);
File file = new File(filePath);
if(!file.exists() || !file.isFile()){
response.sendError(HttpServletResponse.SC_NOT_FOUND);
return;
}
String range = request.getHeader("range");
long fileLen = file.length();
long begin = 0;
long end = fileLen - 1;
String contentRange = null;
if (range != null) {
//设置状态
response.setStatus(HttpServletResponse.SC_PARTIAL_CONTENT);
//得到请求byte范围
String rangeBytes = range.replace("bytes=", "");
String[] rangeArr = rangeBytes.trim().split("-");
begin = Long.parseLong(rangeArr[0]);
// 如果请求有结束范围 eg:1024000-2058220
if (rangeArr.length > 1) {
end = Long.parseLong(rangeArr[1]);
}
contentRange = new StringBuffer("bytes ").append(begin).append("-")
.append(end).append("/").append(fileLen).toString();
}
// 设置响应信息
response.setContentType("application/octet-stream; charset=utf-8");
response.setHeader("Accept-Ranges", "bytes");
response.setHeader("Content-Range", contentRange);
request.setCharacterEncoding("UTF-8");
response.addHeader(
"Content-Disposition",
"attachment;filename="
+ new String(filePath.substring(
filePath.lastIndexOf(File.separator) + 1)
.getBytes("gb2312"), "ISO8859-1"));
response.addHeader("Content-Length", String.valueOf(end + 1 - begin));
ServletOutputStream out = null;
RandomAccessFile randomf = null;
try {
randomf = new RandomAccessFile(file, "r");
out = response.getOutputStream();
byte[] bt = new byte[1024 * 1024];
int i = -1;
try {
// 读取数据
randomf.seek(begin);
while ((i = randomf.read(bt)) != -1) {
if (randomf.getFilePointer() >= end) {
out.write(bt, 0,
(int) (i + end - randomf.getFilePointer() + 1));
break;
} else
out.write(bt, 0, i);
}
out.flush();
} catch (Exception e) {
System.out.println("下载报错:" + e.toString());
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
randomf.close();
} catch (Exception e) {
}
if (out != null)
out.close();
}
}
只支持:请求range为
1:null
2:xxxxxxx-
3:xxxxxxx-yyyyyyyyy
分享到:
相关推荐
Android中实现断点续传下载功能,有详细的注释,需要的打包带走。
python多线程,断点续传下载程序,功能比较简单,可以进行二次开发。实现更好用的 功能。
可设置下载的线程数、下载任务的线程函数、多线程断点续传下载一个文件、关于BOOL bForceDownload/*=FALSE*/的定义,如果为 TRUE 表示强制性重新下载,以下载的部分将会被删除,FALSE 表示断点续传,并创建多线程...
一个适用于android环境的断点续传下载模块,支持暂停、继续。实例中通过几个下载wma音乐文件的例子,来演示android下载内容,并支持暂停、继续的功能,并可在意外断开的情况下,下次打开后继续下载,也就是断点续传...
《Android多线程断点续传下载网络上的音/视频等各种文件》多线程,断点续传,各种网络上的数据,下载网络上的数据时基本功!加油了各位!
WPF实现断点续传下载,C#实现断点续传下载。支持断网、杀进程、重启下载客户端。
Android-Service系列之断点续传下载
断点续传下载的demo ,用到ASIHTTP封装引擎。
多线程-断点续传下载工具 功能描述: 实现同时下载多个文件,下载的过程中可以临时终止下载,可以随时继续下载。 该源码全是干货。核心源码一幕了然。
C# 断点续传下载文件,代码简单,我用Visual 2013,编译可以直接运行。
我自己整理的三个断点续传下载的Demo,分别是:多线程单任务的断点续传下载,多线程多任务的断点续传下载,检索本地的多线程多任务断点续传下载,积分是要的多了,不过你值得拥有!
通过HTTP协议实现断点续传下载
一个Delphi支持多线程的断点续传下载模块源码,可用在Delphi下载程序中,部分参数设置: dtAddTime : TDateTime; //发布时间 sResTitle : string; //资源名称 sDownloadURL, sSavedPath : string; //下载及...
android多线程断点续传下载源代码,有需要的朋友可以下载
这是java实现多线程断点续传下载功能的源代码,对于学习java网络编程、多线程等基础知识的同学有一定的参考作用,希望能够这个资源能够对你们有帮助