直接上源码
Servlet源码
protected void service(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
//获取文件URI
String path = URLDecoder.decode(request.getRequestURI().replace(
getServletContext().getContextPath() + "/download", ""),"UTF-8");
//获取文件
File file = (File) ManualBuffer.get(path);
if (file == null) {
DirectoryTree dt = DirectoryTree.getInstance();
file = dt.findByPath(path);
if (file == null) {
response.sendError(404);
return;
}
ManualBuffer.put(path, file);
}
//文件名
String filename=file.getFilename();
//获取文件读取对象
FileReader fr=file.getReader();
//获取浏览器类型
String browser=request.getHeader("user-agent");
// 设置响应头,206支持断点续传
int http_status=206;
if(browser.contains("MSIE"))
http_status=200;//200 响应头,不支持断点续传
response.reset();
response.setStatus(http_status);
//响应头
response.setContentType("application/octet-stream;charset=UTF-8");
try {
//下载起始位置
long since=0;
//下载结束位置
long until=file.getSize()-1;
//获取Range,下载范围
String range=request.getHeader("range");
if(range!=null){
//剖解range
range=range.split("=")[1];
String[] rs=range.split("-");
if(AuthFilter.isDigit(rs[0])){
since=Integer.parseInt(rs[0]);
}
if(rs.length>1&&AuthFilter.isDigit(rs[1])){
until=Integer.parseInt(rs[1]);
}
}
//设置响应头
response.setHeader("Accept-Ranges", "bytes");
response.setHeader("Content-Range", "bytes "+since+"-"+ until + "/"
+ file.getSize());
//文件名用ISO08859_1编码
response.setHeader("Content-Disposition", "attachment; filename=\"" +
new String(filename.getBytes(),"ISO8859_1")+ "\"");
response.setHeader("Content-Length", "" + (until-since+1));
System.out.println("download: "+filename);
//定位到请求位置
fr.seek(since);
byte[] buffer=new byte[128*1024];
int len;
boolean full=false;
//读取,输出流
while((len=fr.read(buffer))>0){
if(fr.tell()-1>until){
len=(int) (len-(fr.tell()-until-1));
full=true;
}
response.getOutputStream().write(buffer, 0, len);
if(full)
break;
}
//输出
response.getOutputStream().flush();
response.getOutputStream().close();
} catch (java.net.SocketException e) {
//连接断开
}finally{
if(fr!=null)
fr.close();
}
response.flushBuffer();
}
FileReader接口
public interface FileReader {
/**
* 移动文件指针到指定位置
* @param pos
* @throws IOException
*/
public void seek(long pos) throws IOException;
/**
* 获取文件指针位置
* @return 文件指针位置
* @throws IOException
*/
public long tell() throws IOException;
/**
* 从文件指针开始读取一段数据到数组中,返回读取的字节数
* @param byte数组
* @return 读取的字节数
* @throws IOException
*/
public int read(byte[] bytes) throws IOException;
/**
* 从文件指针开始读取一段数据到数组指定位置中,返回读取的字节数
* @param byte数组
* @param off数组偏移量
* @param len读取的最大字节数
* @return 读取的字节数
* @throws IOException
*/
public int read(byte[] bytes, int off, int len) throws IOException;
/**
* 关闭
*/
public void close();
}
分享到:
相关推荐
java 多线程断点续传 java 多线程断点续传 java 多线程断点续传
javaweb毕业设计-Java多线程与线程安全实践-基于Http协议的断点续传(可做课程设计).rarjavaweb毕业设计-Java多线程与线程安全实践-基于Http协议的断点续传(可做课程设计).rarjavaweb毕业设计-Java多线程与线程安全...
基于 Servlet+jsp+mysql 开发 javaWeb 学生宿舍管理系统基于 Servlet+jsp+mysql 开发 javaWeb 学生宿舍管理系统基于 Servlet+jsp+mysql 开发 javaWeb 学生宿舍管理系统基于 Servlet+jsp+mysql 开发 javaWeb 学生宿舍...
使用Javaweb已经Java客户端,实现文件的断点续传功能,文档中包括客户端和服务端
包括一个客户端java文件,可以用来上传文件,但是要修改文件的地址;和一个服务端的完整JavaWeb项目,需要自己导入开发工具中调试
本资源是基于javweb 的jsp和servlet完成的用户登录、注册和注销的代码【含数据库】 详细教程,访问https://blog.csdn.net/kese7952/article/details/82944525
基于Javaweb的咖啡厅点单系统jsp+servlet 基于Javaweb的咖啡厅点单系统jsp+servlet 基于Javaweb的咖啡厅点单系统jsp+servlet 基于Javaweb的咖啡厅点单系统jsp+servlet 基于Javaweb的咖啡厅点单系统jsp+servlet 基于...
Java JSP+servlet+javaweb +mysql数据库 通用型信息管理系统,文件管理系统Java JSP+servlet+javaweb +mysql数据库 通用型信息管理系统,文件管理系统Java JSP+servlet+javaweb +mysql数据库 通用型信息管理系统,文件...
1.断点续传的原理 2.用什么方法实现提交range bytes 3.保存文件采用什么方法
断点续传Demo.zip
这是一个纯JavaWeb项目,采用MVC模式,即 模型(model)-视图(view)-控制器(controller),没有使用其他框架,采用的是纯servlet+jsp实现的一个简易选课JavaWeb项目,实现的功能如下:包括 **管理员 教师 学生** ...
基于JavaWeb Servlet+JSP+MYSQL+Bootstrap 文章管理系统 基于JavaWeb Servlet+JSP+MYSQL+Bootstrap 文章管理系统 基于JavaWeb Servlet+JSP+MYSQL+Bootstrap 文章管理系统 基于JavaWeb Servlet+JSP+MYSQL+Bootstrap ...
JSP+JavaBean+Mysql+JDBC+Servle,完美实现登录注册功能,实现密码箱功能
基于servlet+jsp+mysql实现的javaweb校园车辆管理系统源码+数据库文件.zip 内含演示视频,代码完整下载可用。 基于servlet+jsp+mysql实现的javaweb校园车辆管理系统源码+数据库文件.zip 内含演示视频,代码完整...
通过JSP加Servlet技术实现简易的购物车功能,适合初学JSP的程序猿参考该代码理解JSP与客户端页面相结合的强大功能
今天公司,做项目的时候突然客户需要,在页面实现上传文件,并且还得支持断点续传的功能,郁闷啊,只得花时间去弄了,一般现在网上说的都是用FTP的形式做的,可是客户不搞,花了大半天的时间才弄出来,就发上来,让...
完整的 JSP+SERVLET+MYSQL实现的增删改查javaweb小例子
javaweb项目是由jsp+servlet+mysql技术所写的,项目里面有创建表的sql文件,功能包括了完整的对用户的添加,修改,删除,查询整表,等技术,很适合基础学习,项目目录层次清晰,可在基础上继续添加新的功能,希望...
多线程断点式下载示例代码,再分享一个Java 多线程断点式下载模块,主要原理是: 把context分为poolSize段,计算每段的长度。如果文件已存在,根据临时文件中记载的线程数量,继续上次的任务,如果下载的目标文件不...
javaweb之jsp+servlet简单实现学生信息管理系统,主要使用jsp+servlet技术实现简单的增删改查