背景

linux未部署文件服务器,通过springboot提交对外的地址,将linux的文件转视频流

代码

  • 配置类
1
2
3
4
5
6
7
8
9
10
11
12
13
/**
* 文件流转视频流
*/
@Component
public class NonStaticResourceHttpRequestHandler extends ResourceHttpRequestHandler {
public final static String ATTR_FILE = "NON-STATIC-FILE";

@Override
protected Resource getResource(HttpServletRequest request) {
final Path filePath = (Path) request.getAttribute(ATTR_FILE);
return new FileSystemResource(filePath);
}
}
  • 业务实现类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
private static final String UTF8 = "UTF-8";
@GetMapping("/download/{name}")
public void downLoadFile(@PathVariable("name") String name, HttpServletRequest request, HttpServletResponse response) throws IOException {
//在服务器上的地址
String rootUrl = "/root/prod/file/";
File file = new File(rootUrl+name);
response.setCharacterEncoding(UTF8);
InputStream is = null;
OutputStream os = null;
try {
// 分片下载 Range表示方式 bytes=100-1000 100-
long fSize = file.length();
response.setContentType("application/x-download");
String fileName = URLEncoder.encode(file.getName(), UTF8);
response.addHeader("Content-Disposition", "attachment;filename=" + fileName);
// 支持分片下载
response.setHeader("Accept-Range", "bytes");
response.setHeader("fSize", String.valueOf(fSize));
response.setHeader("fName", fileName);

long pos = 0, last = fSize - 1, sum = 0;
if (null != request.getHeader("Range")) {
response.setStatus(HttpServletResponse.SC_PARTIAL_CONTENT);
String numberRange = request.getHeader("Range").replaceAll("bytes=", "");
String[] strRange = numberRange.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(numberRange.replaceAll("-", "").trim());
}
}
long rangeLength = 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(rangeLength));

os = new BufferedOutputStream(response.getOutputStream());
is = new BufferedInputStream(new FileInputStream(file));
is.skip(pos);
byte[] buffer = new byte[1024];
int length = 0;
while (sum < rangeLength) {
int readLength = (int) (rangeLength - sum);
length = is.read(buffer, 0, (rangeLength - sum) <= buffer.length ? readLength : buffer.length);
sum += length;
os.write(buffer,0, length);
}
System.out.println("下载完成");
}finally {
if (is != null){
is.close();
}
if (os != null){
os.close();
}
}
}

注:请求Springboot的接口就可直接访问视频流