断点续传JAVA实现
/**
* 断点续传工具
* @author lxycx_xc
* 时间:2017年11月30日
*/
public class BreakpointResume {
private static Logger log = Logger.getLogger(BreakpointResume.class);
/**下载操作,支持断点续传*/
public static void download(HttpServletRequest req,HttpServletResponse resp,String filepath) throws NumberFormatException, IOException{
//请求头参数
File file = new File(filepath);
Long fileSize = file.length();
Long lasttime = file.lastModified();
Long size = fileSize;
int i = 0;
String range = req.getHeader("Range");
String ifm = req.getHeader("If-Modified-Since");
if(ifm!=null&&Long.parseLong(ifm)<lasttime){//检查文件修改时间判断是否启用缓存
resp.setStatus(304);
}else{
byte[] buff = new byte[524288];//1024*1024/2
RandomAccessFile raf = new RandomAccessFile(file, "rw");
BufferedOutputStream bfo = new BufferedOutputStream(resp.getOutputStream());
try {
if(range!=null){//断点续传请求
size = (long)(5242880);//限制每次视频输出的大小
String[] ranges = range.replace("bytes=", "").split("-");
if(ranges.length<2){//为Content-Range参数做铺垫
ranges = new String[]{ranges[0],"0"};
if(fileSize-Long.parseLong(ranges[0])>size){
ranges[1] = String.valueOf(Long.parseLong(ranges[0])+size);
}else{
ranges[1] = String.valueOf(fileSize-1);
}
}
raf.seek(Long.parseLong(ranges[0]));//从指定位置开始读取
resp.setHeader("Last-Modified", String.valueOf(lasttime));//文件最后修改时间
resp.setHeader("Content-Range", "bytes "+StringUtils.join(ranges, "-")+"/"+fileSize);//请求的数据 开始-结束/文件总大小
resp.setStatus(206);
}
int len = 0;
while((len=raf.read(buff))>0&&i<size){
bfo.write(buff);
bfo.flush();
i+=len;
log.debug("本次输出:"+buff.length);
}
} catch (Exception e) {
log.info("输出流非正常关闭:");
} finally{
raf.close();
bfo.close();
log.info("当前请求共输出:"+i);
}
}
}
}
断点续传JAVA实现的更多相关文章
- 视频断点续传+java视频
之前仿造uploadify写了一个HTML5版的文件上传插件,没看过的朋友可以点此先看一下~得到了不少朋友的好评,我自己也用在了项目中,不论是用户头像上传,还是各种媒体文件的上传,以及各种个性的业务需 ...
- Spark案例分析
一.需求:计算网页访问量前三名 import org.apache.spark.rdd.RDD import org.apache.spark.{SparkConf, SparkContext} /* ...
- chunkupload文件上传断点续传组件(java)
chunkupload简介 chunkupload是一款基于java语言的断点续传组件,针对文件上传,非文件下载,集成方便,使用简单. 从整体上讲,chunkupload会对文件进行切片处理,每个切片 ...
- chunkupload 文件上传断点续传组件(java) - 正式发布
chunkupload简介 chunkupload是一款基于java语言的断点续传组件,针对文件上传,非文件下载,集成方便,使用简单. chunkupload实现如下功能: · 实现断点续传 · ...
- 【java 断点续传】
模拟 断点续传 首先,先读取word文件的 一部分 package com.sxd.readLines; import java.io.File; import java.io.FileInputSt ...
- 用 Java 实现断点续传 (HTTP)
断点续传的原理 其实断点续传的原理很简单,就是在 Http 的请求上和一般的下载有所不同而已. 打个比方,浏览器请求服务器上的一个文时,所发出的请求如下: 假设服务器域名为 wwww.sjtu.edu ...
- edtftpj让Java上传FTP文件支持断点续传
在用Java实现FTP上传文件功能时,特别是上传大文件的时候,可以需要这样的功能:程序在上传的过程中意外终止了,文件传了一大半,想从断掉了地方继续传:或者想做类似迅雷下载类似的功能,文件太大,今天传一 ...
- java实现多线程断点续传,上传下载
采用apache 的 commons-net-ftp-ftpclient import java.io.File; import java.io.FileOutputStream; import ja ...
- Java开发之多线程下载和断点续传
代码实现了多线程下载和断点续传功能 import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream ...
随机推荐
- Java连接Sql Server 2008的简单数据库应用
1.从微软官网下载JDBC驱动包 sqljdbc_4.0.2206.100_chs.exe,双击解压文件到指定目录,我的指定目录是: C:\Program Files\Microsoft JDBC D ...
- window7电脑git设置快捷命令
平常git开发的一些命令来回重复的敲,有点麻烦,这里给git的常用的命令设置了快捷键,很方便开发. 我这个是window7环境,下面开始 1.home键 + r 打开运行窗口,点击确定进入黑窗口 2. ...
- 第10章 Docker Machine 相关问题
10.1 打开命令行后,看到下载啥 boot2docker.iso,然后总是超时失败,怎么办? 装了 Docker Toolbox 的 Windows 用户,或者第一次使用 docker-machin ...
- boost::asio学习(定时器)
#include <boost/asio.hpp> #include <iostream> void handle1(const boost::system::error_co ...
- c++包含头文件好还是重新定义好
A.h struct A { int a; int b; }; B.cpp 在B.cpp里面用到这个结构体 有两种方法 .自己定义一个一模一样的结构体 struct A { }; .包含A.h头文件 ...
- 《从零开始学Swift》学习笔记(Day48)——类型检查与转换
原创文章,欢迎转载.转载请注明:关东升的博客 继承会发生在子类和父类之间,是一系列类的继承关系. 例如:Person是类层次结构中的根类,Student是Person的直接子类,Worker是Pers ...
- 160818、CSS页面布局笔记
居中布局 水平居中 父元素和子元素的宽度都未知 inline-block + text-ailgn .child{display:inline-block;} .parent{text-align ...
- 路径规划 Adjacency matrix 传球问题
建模 问题是什么 知道了问题是什么答案就ok了 重复考虑 与 重复计算 程序可以重复考虑 但往目标篮子中放入时,放不放把握好就ok了. 集合 交集 并集 w 路径规划 字符串处理 42423 424 ...
- css选择器的权重
权重会叠加!
- 洛谷 P3393 逃离僵尸岛
洛谷 这道题目其实是最短路裸题. 首先看到题目,要求的到"被占点"距离不大于S的点,自然想到了以"被占点"为源点,求一遍最短路,处理出"危险点&quo ...