断点续传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 ...
随机推荐
- jQuery CSS 操作函数
CSS 属性 描述 css() 设置或返回匹配元素的样式属性. height() 设置或返回匹配元素的高度. offset() 返回第一个匹配元素相对于文档的位置. offsetParent() 返回 ...
- 【ask】vmware(NAT)中的linux突然无法访问互联网网址,但是直接用ip可以访问。
前两天虚拟机里的linuxmint不知何故,突然无法访问互联网了.依稀记得是升级了win7下面的360安全卫士之后发生的事情.所以, 第1步就开始去找防火墙的各种设置,结果没有查到结果. 第2步猛然看 ...
- EasyPlayer.js网页全终端播放器安装使用文档
EasyPlayer.js 集 rtmp, hls, flv, websocket 于一身的网页直播/点播播放器, 使用简单, 功能强大 属性(Property) video-url 视频流地址 St ...
- 宇视4G设备采用GB/T28181协议成功接入EasyGBS国标流媒体平台的设置流程
经过了多天的调试对接,终于将宇视的布控球顺利接入到了EasyGBS的国标平台,特地写一下对接过程中遇到的问题,希望能帮助大家避开一些麻烦: 第一步:电脑连接无线网络IPCWIFI,密码12345678 ...
- set集合可以添加重复元素
set集合判断元素的唯一性要重写hashcode和equals方法,这样就能保证不会加入重复的元素, 但是在以下这种情况下任然可以加入重复元素,即使他们的hashcode和equals方法结果相同 p ...
- commit Commit changes to stable storage 对变化提交
Python36\site-packages\pymysql\connections.py # Python implementation of the MySQL client-server pro ...
- UTF-8, UTF-16, UTF-32 & BOM
FAQ - UTF-8, UTF-16, UTF-32 & BOM http://www.unicode.org/faq/utf_bom.html General questions, rel ...
- 解决table插入tr错位
table中用JavaScript插入隐藏(即display="none";)的tr时,别用display="block";换成display="&q ...
- 2014-08-28——Android和IOS的简单嗅探,以及横竖屏的捕获思路
一般通过navigator.userAgent来嗅探Android系统和IOS系统: if(/android/i.test(navigator.userAgent)){ //android } if( ...
- JS判断是手机访问还是PC端访问网站
<script> if ((navigator.userAgent.match(/(iPhone|iPod|Android|ios|iOS|iPad|Backerry|WebOS|S ...