import com.teleone.ferryportal.model.bo.Storage;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;/**
* @ClassName : VideoDownloadController
* @Description : 断点续传
* @Author : keven
* @Date: 2020-03-30 11:50
*/
@RestController
@Api(tags = ("断点续传接口"))
@Slf4j
public class VideoDownloadController {@Value("${ferry.path.htmlFile}")
private String htmlFilePath;@GetMapping("/download/video/{fileName}")
@ApiOperation("断点续传記錄")
public void download(@PathVariable("fileName") String fileName, HttpServletRequest request, HttpServletResponse response) {
Storage storage = new Storage();
String pathName = htmlFilePath + fileName;
storage.setPathName(pathName);
log.info("断点续传处理中");
downloadVideo(storage, request, response);}
public static void downloadVideo(Storage storage, HttpServletRequest request, HttpServletResponse response) {
File downloadFile = new File(storage.getPathName());
int contentLength = Integer.parseInt(String.valueOf(downloadFile.length()));try {
RandomAccessFile randomFile = new RandomAccessFile(downloadFile, "r");
Throwable var6 = null;try {
ServletOutputStream out = response.getOutputStream();
Throwable var8 = null;try {
String range = request.getHeader("Range");
int start = 0;
int end = 0;
if (range != null && range.startsWith("bytes=")) {
String[] values = range.split("=")[1].split("-");
start = Integer.parseInt(values[0]);
if (values.length > 1) {
end = Integer.parseInt(values[1]);
}
}扫描二维码关注公众号,回复: 11036280 查看本文章int requestSize;
if (end != 0 && end > start) {
requestSize = end - start + 1;
} else {
requestSize = 2147483647;
}response.setContentType("video/mp4");
response.setHeader("Accept-Ranges", "bytes");
if (range == null) {
response.setHeader("Content-length", String.valueOf(contentLength));
} else {
response.setStatus(206);
long requestStart = 0L;
long requestEnd = 0L;
String[] ranges = range.split("=");
if (ranges.length > 1) {
String[] rangeDatas = ranges[1].split("-");
requestStart = (long) Integer.parseInt(rangeDatas[0]);
if (rangeDatas.length > 1) {
requestEnd = (long) Integer.parseInt(rangeDatas[1]);
}
}long length = 0L;
if (requestEnd > 0L) {
length = requestEnd - requestStart + 1L;
response.setHeader("Content-length", "" + length);
response.setHeader("Content-Range", "bytes " + requestStart + "-" + requestEnd + "/" + contentLength);
} else {
length = (long) contentLength - requestStart;
response.setHeader("Content-length", "" + length);
response.setHeader("Content-Range", "bytes " + requestStart + "-" + (contentLength - 1) + "/" + contentLength);
}
}int needSize = requestSize;
byte[] buffer = new byte[4096];
randomFile.seek((long) start);while (needSize > 0) {
int len = randomFile.read(buffer);
out.write(buffer, 0, len);
if (len < buffer.length) {
break;
}needSize -= buffer.length;
}
} catch (Throwable var43) {
var8 = var43;
throw var43;
} finally {
if (out != null) {
if (var8 != null) {
try {
out.close();
} catch (Throwable var42) {
var8.addSuppressed(var42);
}
} else {
out.close();
}
}}
} catch (Throwable var45) {
var6 = var45;
throw var45;
} finally {
if (randomFile != null) {
if (var6 != null) {
try {
randomFile.close();
} catch (Throwable var41) {
var6.addSuppressed(var41);
}
} else {
randomFile.close();
}
}}
} catch (IOException var47) {
log.error("read file error ", var47);
}}
}
视频等大文件java断点续传处理
猜你喜欢
转载自blog.csdn.net/qq_31207917/article/details/105416303
今日推荐
周排行