断点续传的方式进行下载

原文地址 http://blog.csdn.net/saindy5828/article/details/6594478


下载时,用的是HttpServletResponse,如果是用struts2时,可以用 implements 去实现 ServletResponseAware 接口;

然后声明定义一个:

private HttpServletResponse response;

private String fileName;


//这里省去了对 fileName 的get  和  set 方法

重写它的方法:

@Override
    public void setServletResponse(HttpServletResponse response) {
        this.response = response;
    }


最后在Action里,定义一个方法去调用断点续传:

public String download(){

        String mPath ="D:\\"

        //mPath 也可以以读取配置文件的方式进行提取,这里就不再重复了。

        String filePath =mPath+fileName;

        downloadFileRanges(filePath);
        return null;

}



/**

     * 断点续传的方式进行下载
     * @param filePath 带文件名的绝对路径
     * @return
     */
    private String downloadFileRanges(String filePath) {

        System.out.println("下载时,收到传进来的值:" + filePath);
        System.out.println(filePath);

        File file = new File(filePath);
        if (!file.exists()) {
            // 文件不存在
            return null;
        } else {
            FileInputStream fis = null;
            try {
                fis = new FileInputStream(file);

                this.response.setHeader("Accept-Ranges", "bytes");
                long p = 0;
                long l = 0;
                // l = raf.length();
                l = file.length();
                // 如果是第一次下,还没有断点续传,状态是默认的 200,无需显式设置
                // 响应的格式是:
                // HTTP/1.1 200 OK
                if (this.request.getHeader("Range") != null) // 客户端请求的下载的文件块的开始字节
                {
                    // 如果是下载文件的范围而不是全部,向客户端声明支持并开始文件块下载
                    // 要设置状态
                    // 响应的格式是:
                    // HTTP/1.1 206 Partial Content
                    this.response
                            .setStatus(javax.servlet.http.HttpServletResponse.SC_PARTIAL_CONTENT);// 206
                    // 从请求中得到开始的字节
                    // 请求的格式是:
                    // Range: bytes=[文件块的开始字节]-
                    p = Long.parseLong(this.request.getHeader("Range")
                            .replaceAll("bytes=", "").replaceAll("-", ""));
                }
                // 下载的文件(或块)长度
                // 响应的格式是:
                // Content-Length: [文件的总大小] - [客户端请求的下载的文件块的开始字节]
                this.response.setHeader("Content-Length", new Long(l - p)
                        .toString());
                if (p != 0) {
                    // 不是从最开始下载,
                    // 响应的格式是:
                    // Content-Range: bytes [文件块的开始字节]-[文件的总大小 - 1]/[文件的总大小]
                    this.response.setHeader("Content-Range", "bytes "
                            + new Long(p).toString() + "-"
                            + new Long(l - 1).toString() + "/"
                            + new Long(l).toString());
                }
                // response.setHeader("Connection", "Close"); //如果有此句话不能用 IE
                // 直接下载
                // 使客户端直接下载
                // 响应的格式是:
                // Content-Type: application/octet-stream
                this.response.setContentType("application/octet-stream");
                // 为客户端下载指定默认的下载文件名称
                // 响应的格式是:
                // Content-Disposition: attachment;filename="[文件名]"
                // response.setHeader("Content-Disposition",
                // "attachment;filename=\"" + s.substring(s.lastIndexOf("\\") +
                // 1) +
                // "\""); //经测试 RandomAccessFile 也可以实现,有兴趣可将注释去掉,并注释掉
                // FileInputStream 版本的语句
                this.response.setHeader("Content-Disposition",
                        "attachment;filename=" + file.getName() + "");
                // raf.seek(p);
                fis.skip(p);
                byte[] b = new byte[1024];
                int i;
                // while ( (i = raf.read(b)) != -1 ) //经测试 RandomAccessFile
                // 也可以实现,有兴趣可将注释去掉,并注释掉 FileInputStream 版本的语句
                while ((i = fis.read(b)) != -1) {
                    this.response.getOutputStream().write(b, 0, i);
                    this.response.flushBuffer();
                }
                // raf.close();//经测试 RandomAccessFile 也可以实现,有兴趣可将注释去掉,并注释掉
                // FileInputStream 版本的语句
                fis.close();
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                if (fis != null) {
                    try {
                        fis.close();
                        this.response.getOutputStream().close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }

            }
        }
        return null;

    }



最近在 Struts2.xml 里

<action name="download" class="com.test.DonwloadAction" method="download"></action>


在客户端调用:

download.action?fileName=test.mp3


这样就可以实现断点续传


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值