直接上源码
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.jpg`可能是一个示例图片文件,用于演示多线程断点续传的实现。 总结来说,Java中的多线程断点续传结合了并发处理和状态管理,通过分割文件并行处理,提高了文件传输效率,同时通过记录和恢复断点,实现了在...
标题“Java实现断点续传”指的是使用Java编程语言来构建一个支持断点续传功能的系统。这个系统通常包含两个主要部分:客户端和服务器端。客户端负责发起文件上传请求,并能记住已经成功传输的部分,以便在连接中断后...
这个接口可能是一个RESTful API,比如在本例中的`RestDemo`可能就是一个实现了断点续传功能的REST服务。服务端需要能够处理以下关键任务: 1. 接收客户端的续传请求,包含文件名、已传输的字节数和断点位置。 2. ...
8. **多线程与并发**:为了提高传输效率,断点续传可能同时处理多个数据块的传输,利用多线程或异步编程模型,这在现代高性能网络编程中很常见。 在这个"断点续传Demo"中,开发者可能已经实现了上述的一些或全部...
javaweb毕业设计-Java多线程与线程安全实践-基于Http协议的断点续传(可做课程设计).rarjavaweb毕业设计-Java多线程与线程安全实践-基于Http协议的断点续传(可做课程设计).rarjavaweb毕业设计-Java多线程与线程安全...
在本项目中,“基于JSP+JavaBean+Mysql+JDBC+Servlet实现javaWeb登录注册”是一个典型的Java Web应用程序,它使用了多种核心技术来构建一个完整的用户管理系统,包括用户登录和注册。以下是对这些技术及其在项目中的...
断点续传是一项重要的网络数据传输技术,允许在网络传输过程中,当下载中断后,能够从上次中断的位置重新开始下载,而不是从头开始下载。这在文件比较大或者网络条件不稳定的情况下显得尤为重要。 ### 断点续传的...
基于 Servlet+jsp+mysql 开发 javaWeb 学生宿舍管理系统基于 Servlet+jsp+mysql 开发 javaWeb 学生宿舍管理系统基于 Servlet+jsp+mysql 开发 javaWeb 学生宿舍管理系统基于 Servlet+jsp+mysql 开发 javaWeb 学生宿舍...
基于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数据库 通用型信息管理系统,文件...
本资源是基于javweb 的jsp和servlet完成的用户登录、注册和注销的代码【含数据库】 详细教程,访问https://blog.csdn.net/kese7952/article/details/82944525
本项目“JSP+Servlet实现简易购物车功能”就是一个典型的示例,它展示了如何利用这两者来创建一个基本的在线购物系统。以下是关于这个项目及其涉及的技术点的详细解释: 1. **JSP(JavaServer Pages)**:JSP是一种...
这是一个纯JavaWeb项目,采用MVC模式,即 模型(model)-视图(view)-控制器(controller),没有使用其他框架,采用的是纯servlet+jsp实现的一个简易选课JavaWeb项目,实现的功能如下:包括 **管理员 教师 学生** ...
在本项目中,"javaweb课程设计"是围绕Servlet和JSP技术构建的一个在线购物商城系统。这个系统旨在让学生或开发者了解如何在实际场景中应用Java Web开发技术,实现一个功能完备的电子商务平台。以下是关于这个项目所...
基于JavaWeb Servlet+JSP+MYSQL+Bootstrap 文章管理系统 基于JavaWeb Servlet+JSP+MYSQL+Bootstrap 文章管理系统 基于JavaWeb Servlet+JSP+MYSQL+Bootstrap 文章管理系统 基于JavaWeb Servlet+JSP+MYSQL+Bootstrap ...
本项目"JSP+SERVLET+MYSQL实现的增删改查javaweb小例子"提供了一个基础的实战示例,帮助开发者了解如何将这三种技术有效地结合在一起,实现一个简单的Web应用,处理用户信息的CRUD(Create, Read, Update, Delete)...
基于servlet+jsp+mysql实现的javaweb校园车辆管理系统源码+数据库文件.zip 内含演示视频,代码完整下载可用。 基于servlet+jsp+mysql实现的javaweb校园车辆管理系统源码+数据库文件.zip 内含演示视频,代码完整...
JavaWeb房屋租赁管理系统是基于Java技术栈开发的一个实用应用程序,主要利用Servlet、JSP和MySQL数据库来实现。这个系统提供了一整套完善的房屋租赁管理功能,适用于物业、中介公司或个人房东进行房源信息管理。系统...
今天公司,做项目的时候突然客户需要,在页面实现上传文件,并且还得支持断点续传的功能,郁闷啊,只得花时间去弄了,一般现在网上说的都是用FTP的形式做的,可是客户不搞,花了大半天的时间才弄出来,就发上来,让...
【标题】"javaweb图书购买网(jsp+servlet+mysql)"揭示了这是一个基于JavaWeb技术构建的在线图书购买系统。这个系统的核心组件包括客户端的交互界面(jsp)、服务器端的业务逻辑处理(servlet)以及数据库存储(mysql...