2 回答

TA贡献1852条经验 获得超7个赞
如果有更好的实施,请分享。
OutputStream output;
if (request.getHeader("range") != null) {
response.setStatus(206);
String rangeValue = request.getHeader("range").trim().substring("bytes=".length());
long fileLength = outputFile.length();
long start, end;
if (rangeValue.startsWith("-")) {
end = fileLength - 1;
start = fileLength - 1 - Long.parseLong(rangeValue.substring("-".length()));
} else {
String[] range = rangeValue.split("-");
start = Long.parseLong(range[0]);
end = range.length > 1 ? Long.parseLong(range[1]) : fileLength - 1;
}
if (end > fileLength - 1) {
end = fileLength - 1;
}
if (start <= end) {
long contentLength = end - start + 1;
response.setHeader("Content-Length", contentLength + "");
response.setHeader("Content-Range", "bytes " + start + "-" + end + "/" + fileLength);
response.setHeader("Content-Type", "video/mp4");
response.setHeader("Content-Disposition", "inline; filename=test.mp4");
RandomAccessFile raf = new RandomAccessFile(outputFile, "r");
raf.seek(start);
output = response.getOutputStream();
byte[] buffer = new byte[2096];
int bytesRead = 0;
int totalRead = 0;
while (totalRead < contentLength) {
bytesRead = raf.read(buffer);
totalRead += bytesRead;
output.write(buffer, 0, bytesRead);
}
}
} else {
try (InputStream input = new FileInputStream(outputFile.getPath())) {
response.setContentType("video/mp4");
response.setHeader("Content-Disposition", "inline; filename=test.mp4");
response.setStatus(200);
output = response.getOutputStream();
byte[] buffer = new byte[2096];
int read;
while ((read = input.read(buffer)) != -1) {
output.write(buffer, 0, read);
}
output.flush();
output.close();
}
}
添加回答
举报