`

Java Web 文件下载之断点续传

阅读更多

        断点续传,听上去似乎是个比较高级的话题,本文只讲述一下http版的断点续传,其他协议的大家可以自行研究。

        http协议中,服务端实现断点续传首先需要读取客户端传送的Range头信息,比如“Range: bytes=12583394-这个就是指原来正在下载的文件需要从第12583394字节继续下载,然后我们利用java.io.File的skip方法,舍弃掉原文件的前n个字节,接着就继续慢慢write吧。。。

       但是客户端又是如何判断服务端是否支持断点续传的呢?主要就是Accept-Ranges和Content-Length头信息。比如“Accept-Ranges:bytes”和“Content-Length:99999999”。有了这两个头信息,客户端就认为服务端是支持断点续传的了。

       然后需要注意的是,假如客户端刚才由于某些原因,暂停了下载,现在恢复的时候,就会如前所述,传来Range头信息,这时候,我们的response就需要设置一下状态码,这里应该设置成206(详细解释请看http://en.wikipedia.org/wiki/List_of_HTTP_status_codes),还有就是Content-Range头信息,格式为“bytes x-(y-1)/y”,x就是客户端传来的开始字节位置,y就是文件长度。

(以上转自:http://blog.csdn.net/xiaoxiaoxuewen/article/details/7701170

 

实例代码如下:

/**
	 * 下载服务器已存在的文件
	 * 
	 * @param request
	 * @param response
	 * @param proposeFile
	 * @throws IOException
	 * @throws FileNotFoundException
	 */
	private void downloadExistsFile(HttpServletRequest request,
			HttpServletResponse response, File proposeFile) throws IOException,
			FileNotFoundException {
		log.debug("下载文件路径:" + proposeFile.getPath());
		long fSize = proposeFile.length();
		// 下载
		response.setContentType("application/x-download");
		String isoFileName = this
				.encodeFilename(proposeFile.getName(), request);
		response.setHeader("Accept-Ranges", "bytes");
		response.setHeader("Content-Length", String.valueOf(fSize));
		response.setHeader("Content-Disposition", "attachment; filename="
				+ isoFileName);
		long pos = 0;
		if (null != request.getHeader("Range")) {
			// 断点续传
			response.setStatus(HttpServletResponse.SC_PARTIAL_CONTENT);
			try {
				pos = Long.parseLong(request.getHeader("Range").replaceAll(
						"bytes=", "").replaceAll("-", ""));
			} catch (NumberFormatException e) {
				log.error(request.getHeader("Range") + " is not Number!");
				pos = 0;
			}
		}
		ServletOutputStream out = response.getOutputStream();
		BufferedOutputStream bufferOut = new BufferedOutputStream(out);
		InputStream inputStream = new FileInputStream(proposeFile);
		String contentRange = new StringBuffer("bytes ").append(
				new Long(pos).toString()).append("-").append(
				new Long(fSize - 1).toString()).append("/").append(
				new Long(fSize).toString()).toString();
		response.setHeader("Content-Range", contentRange);
		log.debug("Content-Range", contentRange);
		inputStream.skip(pos);
		byte[] buffer = new byte[5 * 1024];
		int length = 0;
		while ((length = inputStream.read(buffer, 0, buffer.length)) != -1) {
			bufferOut.write(buffer, 0, length);
		}
		bufferOut.flush();
		bufferOut.close();
		out.close();
		inputStream.close();
	}

 

 

 

分享到:
评论
3 楼 sfg1314 2015-09-28  
暂停后重新下载就会报错:ClientAbortException:  java.io.IOException
2 楼 sfg1314 2015-09-28  
暂停后重新下载报错啊
1 楼 aliahhqcheng 2013-07-26  
soga

相关推荐

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

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

    基于Java的FastDFS大文件上传与断点续传设计源码

    本源码项目是基于Java的FastDFS大文件上传与断点续传设计,包含36个文件,主要使用Java、JavaScript和CSS编程语言。该项目旨在实现h5与fastdfs之间的高性能断点续传、秒传、大文件上传以及使用redis文件锁。系统提供...

    java 文件上传下载 断点续传 断点上传

    本项目提供了两种实现方式,一种是基于Web端的上传下载,另一种是通过Java接口实现的断点续传上传。 1. **Web端上传下载**: - 这种方法通常涉及到HTTP协议,使用HTML表单或者AJAX技术。用户通过Web页面选择本地...

    Java实现断点续传

    Java实现断点续传是一项在文件传输中非常实用的技术,特别是在大文件传输或者网络不稳定的情况下。断点续传允许用户在文件传输中断后从上次中断的位置继续,而不是重新开始整个传输过程,极大地提高了效率和用户体验...

    java实现下载断点续传

    Java 实现下载断点续传是一项重要的技术,尤其在大文件下载或网络不稳定的情况下,能够提高用户体验并降低服务器压力。断点续传的基本原理是,当用户暂停或因网络问题中断下载后,服务器会记住已下载的部分,下次...

    java实现大文件上传分片上传断点续传.zip

    Java中实现断点续传需要记录每个分片的上传状态,通常存储在数据库或临时文件中,当再次上传时检查已上传的分片并跳过。 4. **SpringBoot框架**:SpringBoot简化了Spring应用的初始化和配置,提供了自动配置、内嵌...

    spring boot实现大文件断点续传

    断点续传是一种文件传输技术,它允许用户在文件上传或下载过程中暂停,然后在稍后的时间从暂停的地方继续,而不是重新开始。这大大提高了用户体验,特别是对于大文件,如高清视频、大型软件安装包等。 Spring Boot...

    Java实现文件的断点续传(HTTP)

    ### Java 实现文件断点续传(HTTP)技术详解 #### 一、断点续传的基本原理 断点续传是一种在网络传输过程中,当传输中断后能够从中断处继续传输的技术。这种技术对于大文件的传输尤其有用,可以避免因为网络问题导致...

    springboot+vue 大文件上传 包括断点续传 秒传 分片上传.zip

    本项目"springboot+vue 大文件上传 包括断点续传 秒传 分片上传.zip"提供了一套完整的解决方案,针对大文件上传进行了优化,确保了上传的高效性和可靠性。 首先,我们来看SpringBoot的部分。SpringBoot是基于Spring...

    spring boot + plupload实现大文件断点续传

    结合plupload这样的前端文件上传库,可以实现大文件的断点续传功能,提升用户体验并确保文件传输的可靠性。下面我们将详细探讨如何使用Spring Boot和plupload实现这一功能。 首先,plupload是一款开源的多浏览器...

    基于vue+elementui实现断点续传、分片上传、秒传.zip

    在现代Web应用开发中,文件上传是一个常见的功能需求,尤其对于大文件的处理,断点续传、分片上传和秒传技术变得尤为重要。本文将详细介绍如何使用Vue.js框架结合Element UI库来实现这些高级上传功能。 Vue.js是...

    断点续传实例

    在Java中实现断点续传,主要是为了提高大文件传输的效率和可靠性,尤其在上传或下载大型文件时,避免因网络不稳定而频繁重传。 在给定的压缩包文件中,虽然没有提供具体的源代码,但我们可以根据标题和描述推测,这...

    支持断点续传java多线程下载.doc

    综上,这个Java多线程断点续传的实现涉及了Java多线程编程的核心概念,包括线程创建、同步、通信和状态管理,以及网络I/O和文件操作。同时,为了提供用户友好的界面,还涉及到UI更新和进度反馈的实现。

    SWF 断点续传Java、PHP、Perl

    断点续传技术则允许用户在上传或下载大文件时,如果因为网络中断或其他原因暂停,可以在稍后从上次中断的位置继续,而无需重新开始。 描述中提到的“良好的界面”意味着设计者关注用户体验,可能涉及到UI(用户界面...

    SpringBoot分片上传Excel大文件,支持断点续传,EasyExcel处理百万级数据

    前端Excel大文件file slice分片,md5校验文件完整性并作文件标识记录写入数据库,支持断点续传。文件上传完毕后,使用EasyExcel读取文件流,处理Excel数据写入数据库中,可处理百万级数据。项目完整,连接数据库即可...

    大文件上传支持断点续传springboot版

    在IT行业中,大文件上传和断点续传是常见的需求,尤其在云存储、文件分享以及数据备份等场景。SpringBoot作为一个轻量级的Java框架,因其简洁的配置和强大的功能,被广泛应用在各种项目中。本项目"大文件上传支持...

    Net Core文件上传、断点续传-前端基于Web Uploader 支持通过input file跟流上传.zip

    在.NET Core中实现文件上传和断点续传是一项常见的任务,尤其在开发Web应用程序时。本文将详细探讨如何使用Web Uploader作为前端工具,并结合.NET Core后端来实现实现这一功能。 首先,Web Uploader是一款强大的...

Global site tag (gtag.js) - Google Analytics