本文实例为大家分享了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 list断点续传_java实现文件断点续传下载功能相关推荐

  1. java 后台断点续传_Java实现文件断点续传

    下面是编程之家 jb51.cc 通过网络收集整理的代码片段. 编程之家小编现在分享给大家,也给大家做个参考. import java.io.File; import java.io.IOExcepti ...

  2. Java如何实现文件打包下载功能

        在日常项目开发中,我们会经常遇到,上传下载以及打包的常用功能,本节中就如何利用JAva自带的类库,实现zip压缩打包文件下载进行详细说明.注:不支持中文文件名,可在上传时就重命名文件名称.(下 ...

  3. 关于文件导出(下载)功能不兼容IE浏览器的解决方案

    关于文件导出(下载)功能不兼容IE浏览器的解决方案 参考文章: (1)关于文件导出(下载)功能不兼容IE浏览器的解决方案 (2)https://www.cnblogs.com/padaleidelei ...

  4. 关于使用DataGrid的ButtonColumn,动态添加DataGrid列,实现不定列n个文件的下载功能...

    一.使用DataGrid的ButtonColumn,动态添加DataGrid列,实现不定列n个文件的下载功能 在aspx页面中的代码如下: <asp:datagrid id="User ...

  5. python django下载 功能如何实现_Python中django文件传输下载功能的实现

    Python中django文件传输下载功能的实现,基于Django建立的网站,如果提供文件下载功能,最简单的方式莫过于将静态文件交给Nginx等处理,但有些时候,由于网站本身逻辑,需要通过Django ...

  6. java多线程下载源码_Java多线程文件分片下载实现的示例代码

    多线程下载介绍 多线程下载技术是很常见的一种下载方案,这种方式充分利用了多线程的优势,在同一时间段内通过多个线程发起下载请求,将需要下载的数据分割成多个部分,每一个线程只负责下载其中一个部分,然后将下 ...

  7. java下载图片压缩包_java压缩文件和下载图片示例

    本文实例为大家分享了java压缩文件和下载图片示例,供大家参考,具体内容如下 主页面index.xml 项目的主页 主页主页 湖南长沙 发布方式一...... 页面内容压缩演示--gzip 下载图片 ...

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

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

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

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

最新文章

  1. 基于单TCP连接的高吞吐模型设计
  2. 注意!在subList生成子列表之后,一定不要随便更改原列表
  3. Android查看web日志,详解Android WebView监听console错误信息
  4. 如何使用phpMyAdmin管理数据库
  5. input 文本框和 img 验证码对齐问题
  6. UVa10340 - All in All
  7. Cocos2d-x 3.0 开发(四)使用CocoStudio创建UI并载入到程序中
  8. 斑马zebra GX420d打印机的Labview程序
  9. java表情字符怎么判断_判断字符串中是否包含Emoji表情代码
  10. 13个测试网站访问速度的服务网站
  11. 计算机和软件专业大学排名,全国计算机软件专业大学排名TOP20,清华居然不是第一!...
  12. 第六章(1.8)自然语言处理实战——Jieba中文分词,WordEmbedding的概念和实现
  13. java解惑之最后的笑声
  14. 【Unity3D开发小游戏】《青蛙过河》Unity开发教程
  15. 2022年上半年软考报名常见问题及解答
  16. Paper reading (八十四):Age- and Sex-Dependent Patterns of Gut Microbial Diversity in Human Adults
  17. 西安航空学院计算机等级成绩查询,64所院校成绩查询网址
  18. Windows下程序向Linux下移植实践
  19. Boost -----无法打开文件“libboost_thread-vc120-mt-gd-x32-1_73.lib
  20. Python开发案例,pandas模块使用,实现预测NBA比赛结果

热门文章

  1. IBM存储部分常见配件PN号查询及描述翻译
  2. MapInfo之格式说明(转载)
  3. 第一章 TensorFlow基础——python语法(二)
  4. IDEA不能导入List包
  5. 通过Wireshark抓包分析谈谈DNS域名解析的那些事儿
  6. Java NIO示例:多人网络聊天室完整代码
  7. spring-boot 中实现标准 redis 分布式锁
  8. 基于 abp vNext 和 .NET Core 开发博客项目 - 终结篇之发布项目
  9. Qt QML实现阴影字体
  10. synchronized(this)用法