背景
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 { 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的接口就可直接访问视频流