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