`
lovebirdegg
  • 浏览: 171476 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

[JSP]断点续传多线程链接下载! JSP/Servlet 实现

阅读更多

 

[JSP]断点续传多线程链接下载! JSP/Servlet 实现
2008年04月23日 下午 05:15
  1. < %
  2. /*
  3.    文件名可存为: Download.jsp
  4.    HTTP 协议的请求与响应的会话过程可通过使用 FlashGet 下载 Http:// 连接的过程监视:
  5.    蓝色部分为: 客户端请求
  6.    紫色部分为: 服务器端响应
  7.    如图:
  8.    http://blog.csdn.net/images/blog_csdn_net/playyuer/30110/o_FlashGet.gif
  9.    或参阅,后面的 FlashGet 会话列表:
  10.   
  11. */
  12.    //你可以使用你服务器上的文件及其路径
  13.    String   s   =   "I:\\SetupRes\\Sun\\j2re-1_4_2_05-windows-i586-p.exe" ;
  14.    //String s = "e:\\tree.mdb";
  15.    //经测试 RandomAccessFile 也可以实现,有兴趣可将注释去掉,并注释掉 FileInputStream 版本的语句
  16.    //java.io.RandomAccessFile raf = new java.io.RandomAccessFile(s,"r");
  17.    java . io . File   f   =   new   java . io . File ( s ) ;
  18.    java . io . FileInputStream   fis   =   new   java . io . FileInputStream ( f ) ;
  19.    response . reset ( ) ;
  20.    response . setHeader ( "Server" ,   "playyuer@Microshaoft.com" ) ;
  21.    //告诉客户端允许断点续传多线程连接下载
  22.    //响应的格式是:
  23.    //Accept-Ranges: bytes
  24.    response . setHeader ( "Accept-Ranges" ,   "bytes" ) ;
  25.    long   p   =   0 ;
  26.    long   l   =   0 ;
  27.    //l = raf.length();
  28.    l   =   f . length ( ) ;
  29.    //如果是第一次下,还没有断点续传,状态是默认的 200,无需显式设置
  30.    //响应的格式是:
  31.    //HTTP/1.1 200 OK
  32.    if   ( request . getHeader ( "Range" )   !=   null )   //客户端请求的下载的文件块的开始字节
  33.    {
  34.     //如果是下载文件的范围而不是全部,向客户端声明支持并开始文件块下载
  35.     //要设置状态
  36.     //响应的格式是:
  37.     //HTTP/1.1 206 Partial Content
  38.     response . setStatus ( javax . servlet . http . HttpServletResponse . SC_PARTIAL_CONTENT ) ; //206
  39.     //从请求中得到开始的字节
  40.     //请求的格式是:
  41.     //Range: bytes=[文件块的开始字节]-
  42.     p   =   Long . parseLong ( request . getHeader ( "Range" ) . replaceAll ( "bytes=" , "" ) . replaceAll ( "-" , "" ) ) ;
  43.    }
  44.    //下载的文件(或块)长度
  45.    //响应的格式是:
  46.    //Content-Length: [文件的总大小] - [客户端请求的下载的文件块的开始字节]
  47.    response . setHeader ( "Content-Length" ,   new   Long ( l   -   p ) . toString ( ) ) ;
  48.    if   ( p   !=   0 )
  49.    {
  50.     //不是从最开始下载,
  51.     //响应的格式是:
  52.     //Content-Range: bytes [文件块的开始字节]-[文件的总大小 - 1]/[文件的总大小]
  53.     response . setHeader ( "Content-Range" , "bytes "   +   new   Long ( p ) . toString ( )   +   "-"   +   new   Long ( l   - 1 ) . toString ( )   +   "/"   +   new   Long ( l ) . toString ( ) ) ;
  54.    }
  55.    //response.setHeader("Connection", "Close"); //如果有此句话不能用 IE 直接下载
  56.    //使客户端直接下载
  57.    //响应的格式是:
  58.    //Content-Type: application/octet-stream
  59.    response . setContentType ( "application/octet-stream" ) ;
  60.    //为客户端下载指定默认的下载文件名称
  61.    //响应的格式是:
  62.    //Content-Disposition: attachment;filename="[文件名]"
  63.    //response.setHeader("Content-Disposition", "attachment;filename=\"" + s.substring(s.lastIndexOf("\\") + 1) + "\""); //经测试 RandomAccessFile 也可以实现,有兴趣可将注释去掉,并注释掉 FileInputStream 版本的语句
  64.    response . setHeader ( "Content-Disposition" ,   "attachment;filename=\""   +   f . getName ( )   +   "\"" ) ;
  65.    //raf.seek(p);
  66.    fis . skip ( p ) ;
  67.    byte [ ]   b   =   new   byte [ 1024 ] ;
  68.    int   i ;
  69.    //while ( (i = raf.read(b)) != -1 ) //经测试 RandomAccessFile 也可以实现,有兴趣可将注释去掉,并注释掉 FileInputStream 版本的语句
  70.    while   (   ( i   =   fis . read ( b ) )   !=   - 1   )
  71.    {
  72.     response . getOutputStream ( ) . write ( b , 0 , i ) ;
  73.    }
  74.    //raf.close();//经测试 RandomAccessFile 也可以实现,有兴趣可将注释去掉,并注释掉 FileInputStream 版本的语句
  75.    fis . close ( ) ;
  76. % >
分享到:
评论
1 楼 enefry 2012-03-16  
如果 请求头是 range bytes=100-100  怎么处理

相关推荐

    C#实现支持断点续传多线程下载客户端工具类

    代码如下: /* .Net/C#: 实现支持断点续传多线程下载的 Http Web 客户端工具类 (C# DIY HttpWebClient) * Reflector 了一下 System.Net.WebClient ,改写或增加了若干: * DownLoad、Upload 相关方法! * DownLoad 相关...

    Java多线程与线程安全实践-基于Http协议的断点续传.zip

    JSP将Java代码和特定变动内容嵌入到静态的页面中,实现以静态页面为模板,动态生成其中的部分内容。JSP引入了被称为“JSP动作”的XML标签,用来调用内建功能。另外,可以创建JSP标签库,然后像使用标准HTML或XML标签...

    JAVA 范例大全 光盘 资源

    实例116 多线程断点续传(基于HTTP) 332 实例117 代理服务器的实现 340 实例118 IP多点传送(基于UDP的C/S) 345 第14章 线程 350 实例119 启动和停止线程 350 实例120 多线程同步方法 352 实例121 取钱存钱...

    Java案例开发锦集

    案例3 用JDOM解析XML文件 案例4 Java编制的时钟 案例5 简单日历 案例6 系统内存状态监视程序 案例7 简单计算器 案例8 多线程断点续传 案例9 笛卡尔曲线 第四章 Java与游戏 案例1 ...

    java源码包---java 源码 大量 实例

     Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java文件传输实例不可错过,Java网络编程技能的提升很有帮助。 Java聊天程序,包括服务端和...

    java源码包4

     Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java文件传输实例不可错过,Java网络编程技能的提升很有帮助。 Java聊天程序,包括服务端和...

    JAVA上百实例源码以及开源项目

     Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java文件传输实例不可错过,Java网络编程技能的提升很有帮助。 Java聊天程序,包括服务端和...

    成百上千个Java 源码DEMO 4(1-4是独立压缩包)

    Java局域网通信——飞鸽传书源代码 28个目标文件 内容索引:JAVA源码,媒体网络,飞鸽传书 Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java...

    java源码包2

     Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java文件传输实例不可错过,Java网络编程技能的提升很有帮助。 Java聊天程序,包括服务端和...

    Java范例开发大全 (源程序)

     第13章 多线程编程(教学视频:121分钟) 405  13.1 多线程的五种基本状态 405  实例222 启动线程 405  实例223 参赛者的比赛生活(线程休眠唤醒) 407  实例224 资源搜索并下载(线程...

    java范例开发大全(pdf&源码)

    实例247 多线程断点续传 479 实例248 滚动的珠子 485 实例249 余额查询 489 实例250 滚动的文字 492 实例251 漂浮效果 495 实例252 监视内存的使用情况 499 实例253 璀璨的星空 501 实例254 银行和超市业务的模拟 ...

    java源码包3

     Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java文件传输实例不可错过,Java网络编程技能的提升很有帮助。 Java聊天程序,包括服务端和...

    java范例开发大全源代码

     1.2.1 下载JDK 3  1.2.2 安装JDK 4  1.2.3 配置环境 5  1.2.4 测试JDK配置是否成功 7  实例1 开发第一个Java程序 7  第2章 Java基础类型与运算符(教学视频:39分钟) 9  2.1 基础类型 9  ...

    java范例开发大全

    实例247 多线程断点续传 479 实例248 滚动的珠子 485 实例249 余额查询 489 实例250 滚动的文字 492 实例251 漂浮效果 495 实例252 监视内存的使用情况 499 实例253 璀璨的星空 501 实例254 银行和超市业务的模拟 ...

    JAVA上百实例源码以及开源项目源代码

     Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java文件传输实例不可错过,Java网络编程技能的提升很有帮助。 Java聊天程序,包括服务端和...

    成百上千个Java 源码DEMO 3(1-4是独立压缩包)

    Java局域网通信——飞鸽传书源代码 28个目标文件 内容索引:JAVA源码,媒体网络,飞鸽传书 Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java...

    Visual JDevpro

    4、新建文件向导,包括普通java文件,java接口,jsp,applet,servlet; 5、支持类浏览,通过向导可以自动添加类方法和属性; 6、支持类编译、运行,可以模拟控制台输入输出; 7、支持版本化工程以及导入工程; ...

    Java范例开发大全(全书源程序)

    实例247 多线程断点续传 479 实例248 滚动的珠子 485 实例249 余额查询 489 实例250 滚动的文字 492 实例251 漂浮效果 495 实例252 监视内存的使用情况 499 实例253 璀璨的星空 501 实例254 银行和超市业务...

Global site tag (gtag.js) - Google Analytics