`
lyjilu
  • 浏览: 176132 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论
阅读更多

最近写的一个断点下载功能代码,支持迅雷,旋风,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

 

 

0
4
分享到:
评论

相关推荐

    基于c#的webapi断点续传几种方式及webclient断点续传下载.zip

    本资料包“基于C#的WebAPI断点续传几种方式及WebClient断点续传下载.zip”主要探讨了两种在C#环境下实现断点续传的方法:一是通过WebAPI实现服务端的断点续传功能,二是使用WebClient类进行客户端的断点续传下载。...

    ASP.NET 断点续传下载服务器实现

    断点续传下载是一种网络下载方式,它允许下载过程中丢失连接或停止后,重新连接时从上次下载断点的地方继续下载文件,从而节省时间和网络流量。这种方式特别适合下载大型文件或经常更新的文件,如电影、音乐、软件、...

    Android多线程断点续传下载

    在Android开发中,多线程断点续传下载是一项重要的技术,它允许用户在网络连接不稳定或者设备突然断电的情况下,能够从上次中断的地方继续下载,提高了用户体验。本项目提供的"MultiThreadDownload"是一个实现这一...

    C# Winform 实现Http断点续传下载

    在本文中,我们将深入探讨如何使用C# WinForm来实现HTTP断点续传下载功能。在VS2008开发环境中,C#提供了一个强大的框架,使得开发这种功能变得相对简单。断点续传是一种非常实用的技术,尤其在处理大文件下载时,...

    ios 断点续传下载例子

    在iOS开发中,断点续传下载是一种常见的网络下载技术,尤其在处理大文件时,它允许用户在中断网络连接后从上次停止的地方继续下载,而不是重新开始。本示例项目"ios 断点续传下载例子"是基于ASIHTTPRequest库实现的...

    C# 断点续传下载文件

    本项目"**C# 断点续传下载文件**"就是实现这一功能的一个实例,适用于Visual Studio 2013环境。 断点续传的核心思想是利用HTTP协议中的Range头来请求服务器只发送文件的一部分,而不是整个文件。当用户中断下载后,...

    Android多线程断点续传下载网络上的音/视频等各种文件

    在Android开发中,实现多线程断点续传下载网络上的音视频文件是一项重要的技能,尤其对于提升用户体验和节省用户流量至关重要。断点续传允许用户在暂停或因网络问题中断下载后,从上次停止的位置继续,而多线程则能...

    python多线程,断点续传下载程序

    python多线程,断点续传下载程序,功能比较简单,可以进行二次开发。实现更好用的 功能。

    断点续传下载 (JAVA版 迅雷)

    断点续传下载技术在Java中的实现是一种高效且灵活的文件下载策略,尤其适用于大文件的传输。这种技术允许用户在中断下载后从上次中断的地方继续,而不是从头开始,大大提高了用户体验。以下是对这个主题的详细解释:...

    VC FTP、HTTP 多线程断点续传下载文件.rar

    可设置下载的线程数、下载任务的线程函数、多线程断点续传下载一个文件、关于BOOL bForceDownload/*=FALSE*/的定义,如果为 TRUE 表示强制性重新下载,以下载的部分将会被删除,FALSE 表示断点续传,并创建多线程...

    Delphi多线程 断点续传 下载模块源码.rar

    一个Delphi支持多线程的断点续传下载模块源码,可用在Delphi下载程序中,部分参数设置:  dtAddTime : TDateTime; //发布时间  sResTitle : string; //资源名称  sDownloadURL, sSavedPath : string; //下载及...

    Android多线程断点续传下载三个demo(多线程单任务多任务及检索本地下载)

    在Android开发中,多线程断点续传下载是一项重要的技术,它允许用户在中断下载后,从上次停止的地方继续下载,提高了用户体验。本资源包含三个不同场景的Demo,涵盖了多线程单任务、多线程多任务以及检索本地文件的...

    android 断点续传下载模块源代码.rar

    一个适用于android环境的断点续传下载模块,支持暂停、继续。实例中通过几个下载wma音乐文件的例子,来演示android下载内容,并支持暂停、继续的功能,并可在意外断开的情况下,下次打开后继续下载,也就是断点续传...

    通过HTTP协议实现断点续传下载

    本文将深入探讨通过HTTP协议实现断点续传下载的原理、流程以及相关技术细节。 HTTP协议是互联网上应用最广泛的一种数据传输协议,主要用于Web浏览器和服务器之间的通信。在标准的HTTP协议中,并没有直接支持断点续...

    Android断点续传下载器JarvisDownloader的示例

    【Android 断点续传下载器JarvisDownloader详解】 在Android开发中,高效且可靠的文件下载功能是必不可少的,尤其当文件较大时,断点续传技术显得尤为重要。本文将深入探讨Android断点续传下载器JarvisDownloader的...

    Android-Service系列之断点续传下载

    本系列文章将专注于如何利用Android Service实现一个断点续传下载的功能,这是一种允许用户在应用程序中断后从上次停止的位置继续下载文件的技术。 断点续传下载的核心在于能够识别并利用已下载部分的信息,通常...

Global site tag (gtag.js) - Google Analytics