最近写的一个断点下载功能代码,支持迅雷,旋风,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
分享到:
相关推荐
本资料包“基于C#的WebAPI断点续传几种方式及WebClient断点续传下载.zip”主要探讨了两种在C#环境下实现断点续传的方法:一是通过WebAPI实现服务端的断点续传功能,二是使用WebClient类进行客户端的断点续传下载。...
在Android开发中,多线程断点续传下载是一项重要的技术,它允许用户在网络连接不稳定或者设备突然断电的情况下,能够从上次中断的地方继续下载,提高了用户体验。本项目提供的"MultiThreadDownload"是一个实现这一...
在iOS开发中,断点续传下载是一种常见的网络下载技术,尤其在处理大文件时,它允许用户在中断网络连接后从上次停止的地方继续下载,而不是重新开始。本示例项目"ios 断点续传下载例子"是基于ASIHTTPRequest库实现的...
本项目"**C# 断点续传下载文件**"就是实现这一功能的一个实例,适用于Visual Studio 2013环境。 断点续传的核心思想是利用HTTP协议中的Range头来请求服务器只发送文件的一部分,而不是整个文件。当用户中断下载后,...
在Android开发中,实现多线程断点续传下载网络上的音视频文件是一项重要的技能,尤其对于提升用户体验和节省用户流量至关重要。断点续传允许用户在暂停或因网络问题中断下载后,从上次停止的位置继续,而多线程则能...
python多线程,断点续传下载程序,功能比较简单,可以进行二次开发。实现更好用的 功能。
断点续传下载技术在Java中的实现是一种高效且灵活的文件下载策略,尤其适用于大文件的传输。这种技术允许用户在中断下载后从上次中断的地方继续,而不是从头开始,大大提高了用户体验。以下是对这个主题的详细解释:...
可设置下载的线程数、下载任务的线程函数、多线程断点续传下载一个文件、关于BOOL bForceDownload/*=FALSE*/的定义,如果为 TRUE 表示强制性重新下载,以下载的部分将会被删除,FALSE 表示断点续传,并创建多线程...
一个Delphi支持多线程的断点续传下载模块源码,可用在Delphi下载程序中,部分参数设置: dtAddTime : TDateTime; //发布时间 sResTitle : string; //资源名称 sDownloadURL, sSavedPath : string; //下载及...
在Android开发中,多线程断点续传下载是一项重要的技术,它允许用户在中断下载后,从上次停止的地方继续下载,提高了用户体验。本资源包含三个不同场景的Demo,涵盖了多线程单任务、多线程多任务以及检索本地文件的...
一个适用于android环境的断点续传下载模块,支持暂停、继续。实例中通过几个下载wma音乐文件的例子,来演示android下载内容,并支持暂停、继续的功能,并可在意外断开的情况下,下次打开后继续下载,也就是断点续传...
本文将深入探讨通过HTTP协议实现断点续传下载的原理、流程以及相关技术细节。 HTTP协议是互联网上应用最广泛的一种数据传输协议,主要用于Web浏览器和服务器之间的通信。在标准的HTTP协议中,并没有直接支持断点续...
【Android 断点续传下载器JarvisDownloader详解】 在Android开发中,高效且可靠的文件下载功能是必不可少的,尤其当文件较大时,断点续传技术显得尤为重要。本文将深入探讨Android断点续传下载器JarvisDownloader的...
本系列文章将专注于如何利用Android Service实现一个断点续传下载的功能,这是一种允许用户在应用程序中断后从上次停止的位置继续下载文件的技术。 断点续传下载的核心在于能够识别并利用已下载部分的信息,通常...
断点续传下载技术是网络数据传输中一种重要的优化手段,尤其在大文件下载场景下,它极大地提高了用户下载效率并降低了网络资源的浪费。这一技术的原理是允许下载过程在中断后从上次中断的位置继续,而不是从头开始。...