`

一个支持断点续传、多线程下载的servlet的实现(JavaWeb、JSP)

    博客分类:
  • Java
阅读更多
直接上源码


Servlet源码

protected void service(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		//获取文件URI
		String path = URLDecoder.decode(request.getRequestURI().replace(
				getServletContext().getContextPath() + "/download", ""),"UTF-8");
		//获取文件
		File file = (File) ManualBuffer.get(path);
		if (file == null) {
			DirectoryTree dt = DirectoryTree.getInstance();
			file = dt.findByPath(path);
			if (file == null) {
				response.sendError(404);
				return;
			}
			ManualBuffer.put(path, file);
		}
		//文件名
		String filename=file.getFilename();
		//获取文件读取对象
		FileReader fr=file.getReader();
		//获取浏览器类型
		String browser=request.getHeader("user-agent");
		// 设置响应头,206支持断点续传
		int http_status=206;
		if(browser.contains("MSIE"))
			http_status=200;//200 响应头,不支持断点续传
		response.reset();
		response.setStatus(http_status);
		//响应头
		response.setContentType("application/octet-stream;charset=UTF-8");
		try {
			//下载起始位置
			long since=0;
			//下载结束位置
			long until=file.getSize()-1;
			//获取Range,下载范围
			String range=request.getHeader("range");
			if(range!=null){
				//剖解range
				range=range.split("=")[1];
				String[] rs=range.split("-");
				if(AuthFilter.isDigit(rs[0])){
					since=Integer.parseInt(rs[0]);
				}
				if(rs.length>1&&AuthFilter.isDigit(rs[1])){
					until=Integer.parseInt(rs[1]);
				}
			}
			//设置响应头
			response.setHeader("Accept-Ranges", "bytes");
			response.setHeader("Content-Range", "bytes "+since+"-"+ until + "/"
					+ file.getSize());
			//文件名用ISO08859_1编码
			response.setHeader("Content-Disposition", "attachment; filename=\"" +
					new String(filename.getBytes(),"ISO8859_1")+ "\"");
			response.setHeader("Content-Length", "" + (until-since+1));
			System.out.println("download: "+filename);
			//定位到请求位置
			fr.seek(since);
			byte[] buffer=new byte[128*1024];
			int len;
			boolean full=false;
			//读取,输出流
			while((len=fr.read(buffer))>0){
				if(fr.tell()-1>until){
					len=(int) (len-(fr.tell()-until-1));
					full=true;
				}
				response.getOutputStream().write(buffer, 0, len);
				if(full)
					break;
			}
			//输出
			response.getOutputStream().flush();
			response.getOutputStream().close();
		} catch (java.net.SocketException e) {
			//连接断开
		}finally{
			if(fr!=null)
				fr.close();
		}
		response.flushBuffer();
	}


FileReader接口
public interface FileReader {

	/**
	 * 移动文件指针到指定位置
	 * @param pos
	 * @throws IOException
	 */
	public void seek(long pos) throws IOException;

	/**
	 * 获取文件指针位置
	 * @return 文件指针位置
	 * @throws IOException
	 */
	public long tell() throws IOException;

	/**
	 * 从文件指针开始读取一段数据到数组中,返回读取的字节数
	 * @param byte数组
	 * @return 读取的字节数
	 * @throws IOException
	 */
	public int read(byte[] bytes) throws IOException;

	/**
	 * 从文件指针开始读取一段数据到数组指定位置中,返回读取的字节数
	 * @param byte数组
	 * @param off数组偏移量
	 * @param len读取的最大字节数
	 * @return 读取的字节数
	 * @throws IOException
	 */
	public int read(byte[] bytes, int off, int len) throws IOException;
	
	/**
	 * 关闭
	 */
	public void close();
}
分享到:
评论
2 楼 小蜗牛狂奔 2015-04-30  
qq123zhz 写道
有没有完整一点的

1 楼 qq123zhz 2012-01-09  
有没有完整一点的

相关推荐

    java 多线程断点续传

    而`Java.jpg`可能是一个示例图片文件,用于演示多线程断点续传的实现。 总结来说,Java中的多线程断点续传结合了并发处理和状态管理,通过分割文件并行处理,提高了文件传输效率,同时通过记录和恢复断点,实现了在...

    Java实现断点续传

    标题“Java实现断点续传”指的是使用Java编程语言来构建一个支持断点续传功能的系统。这个系统通常包含两个主要部分:客户端和服务器端。客户端负责发起文件上传请求,并能记住已经成功传输的部分,以便在连接中断后...

    Java断点续传

    这个接口可能是一个RESTful API,比如在本例中的`RestDemo`可能就是一个实现了断点续传功能的REST服务。服务端需要能够处理以下关键任务: 1. 接收客户端的续传请求,包含文件名、已传输的字节数和断点位置。 2. ...

    断点续传Demo.zip

    8. **多线程与并发**:为了提高传输效率,断点续传可能同时处理多个数据块的传输,利用多线程或异步编程模型,这在现代高性能网络编程中很常见。 在这个"断点续传Demo"中,开发者可能已经实现了上述的一些或全部...

    javaweb毕业设计-Java多线程与线程安全实践-基于Http协议的断点续传(可做课程设计).rar

    javaweb毕业设计-Java多线程与线程安全实践-基于Http协议的断点续传(可做课程设计).rarjavaweb毕业设计-Java多线程与线程安全实践-基于Http协议的断点续传(可做课程设计).rarjavaweb毕业设计-Java多线程与线程安全...

    基于JSP+JavaBean+Mysql+JDBC+Servlet实现javaWeb登录注册

    在本项目中,“基于JSP+JavaBean+Mysql+JDBC+Servlet实现javaWeb登录注册”是一个典型的Java Web应用程序,它使用了多种核心技术来构建一个完整的用户管理系统,包括用户登录和注册。以下是对这些技术及其在项目中的...

    用 Java 实现断点续传 (HTTP)

    断点续传是一项重要的网络数据传输技术,允许在网络传输过程中,当下载中断后,能够从上次中断的位置重新开始下载,而不是从头开始下载。这在文件比较大或者网络条件不稳定的情况下显得尤为重要。 ### 断点续传的...

    基于 Servlet+jsp+mysql 开发 javaWeb 学生宿舍管理系统

    基于 Servlet+jsp+mysql 开发 javaWeb 学生宿舍管理系统基于 Servlet+jsp+mysql 开发 javaWeb 学生宿舍管理系统基于 Servlet+jsp+mysql 开发 javaWeb 学生宿舍管理系统基于 Servlet+jsp+mysql 开发 javaWeb 学生宿舍...

    基于Javaweb的咖啡厅点单系统jsp+servlet.zip

    基于Javaweb的咖啡厅点单系统jsp+servlet 基于Javaweb的咖啡厅点单系统jsp+servlet 基于Javaweb的咖啡厅点单系统jsp+servlet 基于Javaweb的咖啡厅点单系统jsp+servlet 基于Javaweb的咖啡厅点单系统jsp+servlet 基于...

    Java JSP+servlet+javaweb +mysql数据库 通用型信息管理系统,文件管理系统

    Java JSP+servlet+javaweb +mysql数据库 通用型信息管理系统,文件管理系统Java JSP+servlet+javaweb +mysql数据库 通用型信息管理系统,文件管理系统Java JSP+servlet+javaweb +mysql数据库 通用型信息管理系统,文件...

    基于jsp+servlet的javaweb实现最基本的用户注册登陆注销功能

    本资源是基于javweb 的jsp和servlet完成的用户登录、注册和注销的代码【含数据库】 详细教程,访问https://blog.csdn.net/kese7952/article/details/82944525

    JSP+Servlet实现简易购物车功能

    本项目“JSP+Servlet实现简易购物车功能”就是一个典型的示例,它展示了如何利用这两者来创建一个基本的在线购物系统。以下是关于这个项目及其涉及的技术点的详细解释: 1. **JSP(JavaServer Pages)**:JSP是一种...

    JavaWeb实现简易教务管理系统-servlet-jsp-MVC

    这是一个纯JavaWeb项目,采用MVC模式,即 模型(model)-视图(view)-控制器(controller),没有使用其他框架,采用的是纯servlet+jsp实现的一个简易选课JavaWeb项目,实现的功能如下:包括 **管理员 教师 学生** ...

    javaweb课程设计,基于Servlet+Jsp的在线购物商城系统

    在本项目中,"javaweb课程设计"是围绕Servlet和JSP技术构建的一个在线购物商城系统。这个系统旨在让学生或开发者了解如何在实际场景中应用Java Web开发技术,实现一个功能完备的电子商务平台。以下是关于这个项目所...

    基于JavaWeb Servlet+JSP+MYSQL+Bootstrap 文章管理系统.zip

    基于JavaWeb Servlet+JSP+MYSQL+Bootstrap 文章管理系统 基于JavaWeb Servlet+JSP+MYSQL+Bootstrap 文章管理系统 基于JavaWeb Servlet+JSP+MYSQL+Bootstrap 文章管理系统 基于JavaWeb Servlet+JSP+MYSQL+Bootstrap ...

    JSP+SERVLET+MYSQL实现的增删改查javaweb小例子

    本项目"JSP+SERVLET+MYSQL实现的增删改查javaweb小例子"提供了一个基础的实战示例,帮助开发者了解如何将这三种技术有效地结合在一起,实现一个简单的Web应用,处理用户信息的CRUD(Create, Read, Update, Delete)...

    基于servlet+jsp+mysql实现的javaweb校园车辆管理系统源码+数据库文件.zip

    基于servlet+jsp+mysql实现的javaweb校园车辆管理系统源码+数据库文件.zip 内含演示视频,代码完整下载可用。 基于servlet+jsp+mysql实现的javaweb校园车辆管理系统源码+数据库文件.zip 内含演示视频,代码完整...

    JavaWeb房屋租赁管理系统源码(servlet+jsp+mysql)

    JavaWeb房屋租赁管理系统是基于Java技术栈开发的一个实用应用程序,主要利用Servlet、JSP和MySQL数据库来实现。这个系统提供了一整套完善的房屋租赁管理功能,适用于物业、中介公司或个人房东进行房源信息管理。系统...

    java web 网站,实现网页直接上传文件,强悍支持断点下载功能

    今天公司,做项目的时候突然客户需要,在页面实现上传文件,并且还得支持断点续传的功能,郁闷啊,只得花时间去弄了,一般现在网上说的都是用FTP的形式做的,可是客户不搞,花了大半天的时间才弄出来,就发上来,让...

    javaweb图书购买网(jsp+servlet+mysql)

    【标题】"javaweb图书购买网(jsp+servlet+mysql)"揭示了这是一个基于JavaWeb技术构建的在线图书购买系统。这个系统的核心组件包括客户端的交互界面(jsp)、服务器端的业务逻辑处理(servlet)以及数据库存储(mysql...

Global site tag (gtag.js) - Google Analytics