根据前端传来的Range 判断支不支持分片下载
response.setHeader("Accept-Ranges", "bytes");
public void fileChunkDownload(HttpServletRequest request, HttpServletResponse response) throws IOException {
String filePath = "E://a.txt";//文件路径
filePath = URLDecoder.decode(filePath, "UTF-8");
File file = new File(filePath);
if (!file.exists()) {
throw new WxException("文件不存在或已被删除");
}
//开始下载
response.setCharacterEncoding("utf-8");
InputStream is = null;
OutputStream os = null;
try {
//分片下载
long fSize = file.length();//获取长度
String fileName = URLEncoder.encode(file.getName(), "utf-8");
String contentType = request.getServletContext().getMimeType(fileName);
// response.setContentType("application/x-download");
response.setContentType(contentType);
response.setHeader("Content-Type", contentType);
response.addHeader("Content-Disposition", "attachment;filename=" + fileName);
//根据前端传来的Range 判断支不支持分片下载
response.setHeader("Accept-Ranges", "bytes");
//定义断点
long pos = 0, last = fSize - 1, sum = 0;
//判断前端需不需要分片下载
if (null != request.getHeader("Range")) {
response.setStatus(HttpServletResponse.SC_PARTIAL_CONTENT);
String numRange = request.getHeader("Range").replaceAll("bytes=", "");
String[] strRange = numRange.split("-");
if (strRange.length == 2) {
pos = Long.parseLong(strRange[0].trim());
last = Long.parseLong(strRange[1].trim());
//若结束字节超出文件大小 取文件大小
if (last > fSize - 1) {
last = fSize - 1;
}
} else {
//若只给一个长度 开始位置一直到结束
pos = Long.parseLong(numRange.replaceAll("-", "").trim());
}
}
long rangeLenght = last - pos + 1;
String contentRange = new StringBuffer("bytes ").append(pos).append("-").append(last).append("/").append(fSize).toString();
response.setHeader("Content-Range", contentRange);
response.setHeader("Content-Length", String.valueOf(rangeLenght));
os = new BufferedOutputStream(response.getOutputStream());
is = new BufferedInputStream(new FileInputStream(file));
is.skip(pos);//跳过已读的文件
byte[] buffer = new byte[1024];
int length = 0;
//相等证明读完
while (sum < rangeLenght) {
length = is.read(buffer, 0, (rangeLenght - sum) <= buffer.length ? (int) (rangeLenght - sum) : buffer.length);
sum = sum + length;
os.write(buffer, 0, length);
}
System.out.println("下载完成");
} finally {
if (is != null) {
is.close();
}
if (os != null) {
os.close();
}
}
}