断点续传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 ...
随机推荐
- MFC多国语言——配置文件
前段时间,因工作需要,本地化了一个英文版本的产品. 在网上查阅了若干资料,在此进行一个简单的整理. 在MFC程序中,实现多国语言的方式很多,我们选择的是使用配置文件的方法. 在通过配置文件方式实现多国 ...
- python3----字符串中的字符倒转
方法一,使用[::-1]: s = 'python' print(s[::-1]) 方法二,使用reverse()方法: n = list(s) n.reverse() print(''.join(n ...
- diango-tinymce富文本编译器
应用到项目中 在settings.py中为INSTALLED_APPS添加编辑器应用 INSTALLED_APPS = ( ... 'tinymce', ) 在settings.py中添加编辑配置项 ...
- iOS内存管理之浅见
当我们用alloc.new.copy创建对象时,对象的应用计数为1,当把这个对象retain时.引用计数+1.当对这个对象发送release消息时,引用计数-1,当对象的引用计数为0时,系统回收这个对 ...
- [Spring Data MongoDB]学习笔记--_id和类型映射
_id字段的映射: MongoDB要求所有的document都要有一个_id的字段. 如果我们在使用中没有传入_id字段,它会自己创建一个ObjectId. { , "accounts&qu ...
- [Spring Data MongoDB]学习笔记--建立数据库的连接
1. 有了上一篇的Mongo后,连接数据库我们还需要更多的信息,比如数据库名字,用户名和密码等. 我们可以继续来配置MongoDbFactory的实例. public interface MongoD ...
- window.XMLHttpRequest对象详解
来自:http://blog.csdn.net/lccone/article/details/7743946 window.XMLHttpRequest XMLHttpRequest对象是当今所有AJ ...
- 使用国内源(brew, pip, npm)
如果网络不行,安装依赖包的速度小于 100k/s 或者丢包严重导致安装很慢,我认为就应该使用国内源了.今天因为国内源的问题弄了很久,我觉得在国内服务器部署,全部应该从国内下载资源.分为两种情况, 存在 ...
- iOS 成员变量和属性的区别
一. 成员变量 1.成员变量的作用范围: @public:在任何地方都能直接访问对象的成员变量 @private:只能在当前类的对象方法中直接访问,如果子类要访问需要调用父类的get/set方法 @p ...
- 对宽度的控制原则 git commit -a -m "M 1、完成less计算得出图片的均分布局;";git push origin master:master
<script> import wepy from 'wepy' import api from '../api/api' export default class recharge ex ...