pdf.js分段加载

pdf.js默认是支持分段加载,大文件能减少打开时间。

目录
前端代码

var pdfview = _path+'js/pdfjs/web/viewer.html';
function online_pdf(path) {
    var index= path.lastIndexOf(".");
//获取后缀
    var ext = path.substr(index+1);
    if (ext=='pdf') {
    	//加载文件接口
        var url_s = _path+'secure/showpdf?identNo='+ path;
        window.open(pdfview+'?file='
            +encodeURIComponent(url_s));
	}else {
	    //如果不是pdf
        download(path);
	}

    //window.open(_url_download+ path );
}

后端代码

    /**
     * 下载文件
     * @param identNo 文件唯一识别码(经URLEncoder编码)
     * @param res
     */
    @RequestMapping(value = "/showpdf", method = RequestMethod.GET)
    public void showpdf(String identNo,HttpServletRequest req, HttpServletResponse res) {
        try {
            service.download(identNo,req, res);
        } catch (Exception e) {
            // e.printStackTrace();
            LogWriter.saveErr(LOG_CODE, e.getMessage());
        }
    }




/**
	 * 下载文件
	 * @param identNo 文件存储路径(经base64加密和URLEncoder编码)
	 * @param res
	 */
	@Override
	public void download(String identNo,HttpServletRequest request,HttpServletResponse response) {
		// 从文件存储服务器下载文件到本地
		File file = getFileFromServer(identNo);
        BufferedInputStream bis = null;
        OutputStream os = null;
        BufferedOutputStream bos = null;
        InputStream is = null;
        try {
            is =new FileInputStream(file);
            bis = new BufferedInputStream(is);
            os = response.getOutputStream();
            bos = new BufferedOutputStream(os);
            // 下载的字节范围
            int startByte,endByte,totalByte;
            if (request != null && request.getHeader("range") != null) {
                // 断点续传
                String[] range = request.getHeader("range").replaceAll("[^0-9\\-]", "").split("-");
                // 文件总大小
                totalByte = is.available();
                // 下载起始位置
                startByte = Integer.parseInt(range[0]);
                // 下载结束位置
                if (range.length > 1) {
                    endByte = Integer.parseInt(range[1]);
                } else {
                    endByte = totalByte - 1;
                }
                // 返回http状态
                response.setStatus(206);
            } else {
                // 正常下载
                // 文件总大小
                totalByte = is.available();
                // 下载起始位置
                startByte = 0;
                // 下载结束位置
                endByte = totalByte - 1;
                // 返回http状态
                response.setHeader("Accept-Ranges","bytes");
                response.setStatus(200);
            }
            // 需要下载字节数
            int length = endByte - startByte + 1;
            // 响应头
            response.setHeader("Accept-Ranges", "bytes");
            response.setHeader("Content-Range", "bytes " + startByte + "-" + endByte + "/" + totalByte);
            response.setContentType("Content-Type: application/octet-stream");
            response.setContentLength(length);
            // 响应内容
            bis.skip(startByte);
            int len = 0;
            byte[] buff = new byte[1024 * 64];
            while ((len = bis.read(buff, 0, buff.length)) != -1) {
                if (length <= len) {
                    bos.write(buff, 0, length);
                    break;
                } else {
                    length -= len;
                    bos.write(buff, 0, len);
                }
            }
        } catch (IOException e) {
            System.out.println("下载中断!");
        } finally {
            FileUtil.closeQuiet(bos);
            FileUtil.closeQuiet(os);
            FileUtil.closeQuiet(bis);
            FileUtil.closeQuiet(is);
        }

	}

第一次请求状态是200,请求头不带range。后面是206,请求头带range
请求

  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 18
    评论
评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值