本文实例为大家分享了java断点续传下载的代码,供大家参考,具体内容如下

1. Java代码

//实现文件下载功能

public String downloadFile(){

File dir = new File(filepath);//获取文件路劲

if(!dir.exists()) {

System.out.println("文件路径错误");

log.debug("文件路径错误");

return "failed";// 判断文件或文件夹是否存在

}

File downloadFile = new File(dir, filename);//在指定目录下查找文件

if(!downloadFile.isFile()){

System.out.println("文件不存在");

log.debug("文件不存在");

return "failed";// 判断文件或文件夹是否存在

}

try {

downloadFileRanges(downloadFile);

} catch(ClientAbortException e){

System.out.println("连接被终止");

log.debug("连接被终止");

} catch (IOException e) {

e.printStackTrace();

}

return null;

}

private void downloadFileRanges(File downloadFile) throws IOException {

// 要下载的文件大小

long fileLength = downloadFile.length();

// 已下载的文件大小

long pastLength = 0;

// 是否快车下载,否则为迅雷或其他

boolean isFlashGet = true;

// 用于记录需要下载的结束字节数(迅雷或其他下载)

long lenEnd = 0;

// 用于记录客户端要求下载的数据范围字串

String rangeBytes = request.getHeader("Range");

//用于随机读取写入文件

RandomAccessFile raf = null;

OutputStream os = null;

OutputStream outPut = null;

byte b[] = new byte[1024];

// 如果客户端下载请求中包含了范围

if (null != rangeBytes)

{

// 返回码 206

response.setStatus(HttpServletResponse.SC_PARTIAL_CONTENT);

rangeBytes = request.getHeader("Range").replaceAll("bytes=", "");

// 判断 Range 字串模式

if (rangeBytes.indexOf('-') == rangeBytes.length() - 1)

{

// 无结束字节数,为快车

isFlashGet = true;

rangeBytes = rangeBytes.substring(0, rangeBytes.indexOf('-'));

pastLength = Long.parseLong(rangeBytes.trim());

}

else

{

// 迅雷下载

isFlashGet = false;

String startBytes = rangeBytes.substring(0,

rangeBytes.indexOf('-'));

String endBytes = rangeBytes.substring(

rangeBytes.indexOf('-') + 1, rangeBytes.length());

// 已下载文件段

pastLength = Long.parseLong(startBytes.trim());

// 还需下载的文件字节数(从已下载文件段开始)

lenEnd = Long.parseLong(endBytes);

}

}

// 通知客户端允许断点续传,响应格式为:Accept-Ranges: bytes

response.setHeader("Accept-Ranges", "bytes");

// response.reset();

// 如果为第一次下载,则状态默认为 200,响应格式为: HTTP/1.1 200 ok

if (0 != pastLength)

{

// 内容范围字串

String contentRange = "";

// 响应格式

// Content-Range: bytes [文件块的开始字节]-[文件的总大小 - 1]||[文件的总大小]

if (isFlashGet)

{

contentRange = new StringBuffer("bytes")

.append(new Long(pastLength).toString()).append("-")

.append(new Long(fileLength - 1).toString())

.append("/").append(new Long(fileLength).toString())

.toString();

}

else

{

contentRange = new StringBuffer(rangeBytes).append("/")

.append(new Long(fileLength).toString()).toString();

}

response.setHeader("Content-Range", contentRange);

}

String fileName = getDownloadChineseFileName(filename);

response.setHeader("Content-Disposition",

"attachment;filename=" + fileName + "");

// 响应的格式是:

response.setContentType("application/octet-stream");

response.addHeader("Content-Length", String.valueOf(fileLength));

try

{

os = response.getOutputStream();

outPut = new BufferedOutputStream(os);

raf = new RandomAccessFile(downloadFile, "r");

// 跳过已下载字节

raf.seek(pastLength);

if (isFlashGet)

{

// 快车等

int n = 0;

while ((n = raf.read(b, 0, 1024)) != -1)

{

outPut.write(b, 0, n);

}

}

else

{

// 迅雷等

while (raf.getFilePointer() < lenEnd)

{

outPut.write(raf.read());

}

}

outPut.flush();

}

catch (IOException e)

{

/**

* 在写数据的时候 对于 ClientAbortException 之类的异常

* 是因为客户端取消了下载,而服务器端继续向浏览器写入数据时, 抛出这个异常,这个是正常的。 尤其是对于迅雷这种吸血的客户端软件。

* 明明已经有一个线程在读取 bytes=1275856879-1275877358,

* 如果短时间内没有读取完毕,迅雷会再启第二个、第三个。。。线程来读取相同的字节段, 直到有一个线程读取完毕,迅雷会 KILL

* 掉其他正在下载同一字节段的线程, 强行中止字节读出,造成服务器抛 ClientAbortException。

* 所以,我们忽略这种异常

*/

}

finally

{

if(outPut != null)

{

outPut.close();

}

if(raf != null)

{

raf.close();

}

}

}

private String getDownloadChineseFileName(String paramName)

{

String downloadChineseFileName = "";

try

{

downloadChineseFileName = new String(paramName.getBytes("GBK"),

"ISO8859-1");

}

catch (UnsupportedEncodingException e)

{

e.printStackTrace();

}

return downloadChineseFileName;

}

public String getFilepath() {

return filepath;

}

public void setFilepath(String filepath) {

this.filepath = filepath;

}

public String getFilename() {

return filename;

}

public void setFilename(String filename) {

this.filename = filename;

}

public HttpServletRequest getRequest() {

return request;

}

public HttpServletResponse getResponse() {

return response;

}

2. struts部分

showDownloadFileNameList

3. jsp部分

文件下载

java断点下载文件_java实现文件断点续传下载功能相关推荐

  1. java 断点上传_java HTTP文件断点上传

    之前仿造uploadify写了一个HTML5版的文件上传插件,没看过的朋友可以点此先看一下~得到了不少朋友的好评,我自己也用在了项目中,不论是用户头像上传,还是各种媒体文件的上传,以及各种个性的业务需 ...

  2. ubuntu资源下载利器:多线程、断点续传下载工具mwget的安装与使用

    ubuntu资源下载利器:多线程.断点续传下载工具mwget的安装与使用

  3. java oss 断点上传文件_java实现oss断点续传

    bucketName ---oss上bucket的名字 key ---文件所在的文件夹加文件名 例如:我想把ceshi.txt 存放在bucket叫aa的里面叫bb的文件夹下.那么我的bucketNa ...

  4. java实现下载压缩文件_java实现文件压缩下载----压缩下载zip

    文件压缩下载 Controller层: /** *文件压缩下载 *billname:文件名 *filename:文件存放路径 */ public void downloadsource(HttpSer ...

  5. java 网络文件_java实现从网络下载多个文件

    java从网络下载多个文件,供大家参考,具体内容如下 首先是打包下载多文件,即打成压缩包在下载. 其次 别处的资源:可以是别的服务器,可以是网上的资源,当然也可以是本地的(更简单) 最后:一次性下载, ...

  6. java用浏览器下载文件_JAVA读取文件流,设置浏览器下载或直接预览操作

    最近项目需要在浏览器中通过url预览图片.但发现浏览器始终默认下载,而不是预览.研究了一下,发现了问题: // 设置response的header,注意这句,如果开启,默认浏览器会进行下载操作,如果注 ...

  7. java 下载zip文件_Java以压缩包方式下载文件

    从云服务器上下载文件,以压缩包方式下载 以下载多个文件为例,需要导入zip4j的jar包,版本不要太高 public void downloadZip(List list, HttpServletRe ...

  8. java浏览器预览文件_JAVA读取文件流,设置浏览器下载或直接预览操作

    最近项目需要在浏览器中通过URL预览图片.但发现浏览器始终默认下载,而不是预览.研究了一下,发现了问题: // 设置response的Header,注意这句,如果开启,默认浏览器会进行下载操作,如果注 ...

  9. java中上传文件_Java中文件上传下载 --使用Minio

    Minio模板类: @RequiredArgsConstructor public class MinioTemplate implements InitializingBean { private ...

  10. java中实现选择文件_Java 实现文件选择对话框及功能

    时间:2018-10-02 概述:文件选择器 Java实现文件选择器,就是大家熟悉的打开文件.选择文件的对话框,本例子分为两部分来进行,一个部分是选择器对话框构建部分,另一部分是文件过滤部分,用于过滤 ...

最新文章

  1. POJ 2653 线段交
  2. python线性整数规划求解_实例详解:用Python解决整数规划问题!
  3. 【django】全局上下文
  4. 【枭·音频】声随意动——浅谈《暗影火炬城》声音设计
  5. SecureCRT设置背景颜色和目录(文件夹)颜色
  6. 多线程:生产者消费者问题
  7. 华为麦芒9正式亮相:6400万三摄,2199元起
  8. Selenium:利用select模块处理下拉框
  9. C#与vb6 com组件的互相调用方法
  10. 一些值得注意的算法题——队列、栈
  11. k8s Service
  12. 分布式网络爬虫功能模块组成
  13. Android | 判断App处于前台还是后台的方案
  14. MaxCompute基本概念和数据类型
  15. KMP算法—终于全部弄懂了
  16. 南充计算机职业学校有哪些专业,南充旅游计算机职业中专学校2020年招生简介...
  17. 黎曼的猜想 MySQL案例练习记录
  18. 【无标题】每个人女人,都需要一面黑色的镜子
  19. 洛谷P1751贪吃虫
  20. 软考中级 真题 2014年下半年 系统集成项目管理工程师 应用技术 下午试卷

热门文章

  1. 【GD32F310开发板试用】gcc启动文件制作
  2. idea使用教程-安装
  3. linux下的遥控器软件下载,万能遥控器软件
  4. C语言--《C专家编程》C语言申明的优先级规则
  5. python爬取有妖气漫画
  6. Sybase数据库按条件导出数据文件
  7. linux 下载git源码,在linux系统下Git源码系统的文件下载
  8. sap服务器安装双系统教程,Ghost安装双系统安装使用图文教程
  9. QT编译libpng
  10. 智慧城市大数据应用案例