当前位置: 首页 > 知识库问答 >
问题:

如何使用Spring MVC返回视频,以便可以使用html5标记导航?

丁和歌
2023-03-14

视频文件与REST接口在同一个服务器上,REST接口只检查session并在发现应该发送哪个视频后发送视频。

这些是我到目前为止尝试过的方法。它们都工作,但没有一个允许导航。

/*
 * This will actually load the whole video file in a byte array in memory,
 * so it's not recommended.
 */
@RequestMapping(value = "/{id}/preview", method = RequestMethod.GET)
@ResponseBody public ResponseEntity<byte[]> getPreview1(@PathVariable("id") String id, HttpServletResponse response) {
    ResponseEntity<byte[]> result = null;
    try {
        String path = repositoryService.findVideoLocationById(id);
        Path path = Paths.get(pathString);
        byte[] image = Files.readAllBytes(path);

        response.setStatus(HttpStatus.OK.value());
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
        headers.setContentLength(image.length);
        result = new ResponseEntity<byte[]>(image, headers, HttpStatus.OK);
    } catch (java.nio.file.NoSuchFileException e) {
        response.setStatus(HttpStatus.NOT_FOUND.value());
    } catch (Exception e) {
        response.setStatus(HttpStatus.INTERNAL_SERVER_ERROR.value());
    }
    return result;
}
/*
 * IOUtils is available in Apache commons io
 */
@RequestMapping(value = "/{id}/preview2", method = RequestMethod.GET)
@ResponseBody public void getPreview2(@PathVariable("id") String id, HttpServletResponse response) {
    try {
        String path = repositoryService.findVideoLocationById(id);
        File file = new File(path)
        response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);
        response.setHeader("Content-Disposition", "attachment; filename="+file.getName().replace(" ", "_"));
        InputStream iStream = new FileInputStream(file);
        IOUtils.copy(iStream, response.getOutputStream());
        response.flushBuffer();
    } catch (java.nio.file.NoSuchFileException e) {
        response.setStatus(HttpStatus.NOT_FOUND.value());
    } catch (Exception e) {
        response.setStatus(HttpStatus.INTERNAL_SERVER_ERROR.value());
    }
}
@RequestMapping(value = "/{id}/preview3", method = RequestMethod.GET)
@ResponseBody public FileSystemResource getPreview3(@PathVariable("id") String id, HttpServletResponse response) {
    String path = repositoryService.findVideoLocationById(id);
    return new FileSystemResource(path);
}

共有1个答案

申浩广
2023-03-14

处理非静态资源的简单解决方案

@SpringBootApplication
public class DemoApplication {

    private final static File MP4_FILE = new File("/home/ego/bbb_sunflower_1080p_60fps_normal.mp4");

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }

    @Controller
    final static class MyController {

        @Autowired
        private MyResourceHttpRequestHandler handler;

        // supports byte-range requests
        @GetMapping("/")
        public void home(
                HttpServletRequest request,
                HttpServletResponse response
        ) throws ServletException, IOException {

            request.setAttribute(MyResourceHttpRequestHandler.ATTR_FILE, MP4_FILE);
            handler.handleRequest(request, response);
        }

        // does not support byte-range requests
        @GetMapping(path = "/plain", produces = "video/mp4")
        public FileSystemResource plain() {

            return new FileSystemResource(MP4_FILE);
        }
    }

    @Component
    final static class MyResourceHttpRequestHandler extends ResourceHttpRequestHandler {

        private final static String ATTR_FILE = MyResourceHttpRequestHandler.class.getName() + ".file";

        @Override
        protected Resource getResource(HttpServletRequest request) throws IOException {

            final File file = (File) request.getAttribute(ATTR_FILE);
            return new FileSystemResource(file);
        }
    }
}

(灵感来自Spring Boots,LogFileMvcEndpoint,与Paul-Warrens(@Paul-Warren)StoreByteRangeHttpRequestHandler,我后来发现了)差不多。

希望Spring在不久的将来能够支持这一点,请参见https://jira.Spring.io/browse/spr-13834(请投赞成票)。

 类似资料:
  • 问题内容: 如果我在Web服务器(Tomcat)中有一个文件并创建标签,则可以观看视频,暂停视频,浏览视频并在完成后重新启动。 但是,如果我创建了一个REST接口,该接口在请求时发送视频文件,并将其URL添加到标签,则只能播放和暂停。没有倒带,没有快进,没有导航,什么也没有。 那么,有什么办法可以解决此问题?我在某处缺少什么吗? 视频文件与REST接口位于同一服务器中,并且REST接口在确定应发送

  • 问题内容: 如果我在Web服务器(Tomcat)中有一个文件并创建标签,则可以观看视频,暂停视频,浏览视频并在完成后重新启动。 但是,如果我创建了一个REST接口,该接口在请求时发送视频文件,并将其URL添加到标签中,那么我只能播放和暂停。 没有倒带,没有快进,没有导航 ,什么也没有。 那么,有什么办法可以解决此问题?我在某处缺少什么吗? 视频文件与REST接口位于同一服务器中 ,并且REST接口

  • 问题内容: Tl; Dr-问题: 用Node.js处理将视频文件流传输到html5视频播放器以 使视频控件继续工作 的正确方法是什么 ? 我 认为 这与处理标头的方式有关。无论如何,这是背景信息。代码 有点 冗长,但是非常简单。 使用Node将小视频文件流化为HTML5视频很容易 我学习了如何非常轻松地将小型视频文件流式传输到HTML5视频播放器。使用此设置,控件可以正常工作,而我的视频也完美无缺

  • 本文向大家介绍可以使用HTML5在相关面试题,主要包含被问及可以使用HTML5在时的应答技巧和注意事项,需要的朋友参考一下 不 ,根据W3C 的HTML5规范文,它不是有效的HTML5: 内容模型: 透明,但必须没有交互式内容后代。 只要其中没有交互内容(例如按钮或其他链接),该元素就可以包裹在整个段落,列表,表格等,甚至整个节中。 换句话说,您可以将除以下内容之外的任何元素嵌套: (如果存在 c

  • 用Node.js处理将视频文件流到html5视频播放器以使视频控件继续工作的正确方法是什么? 我认为这与头的处理方式有关。不管怎样,这是背景资料。代码有点长,但是,它非常简单。 我学会了如何将小视频文件流式传输到HTML5视频播放器。有了这个设置,控制工作没有任何工作,我的部分,视频流完美。这里有一个完整的工作代码和示例视频的工作副本,可以在Google Docs上下载。 客户: 服务器: 但此方

  • 问题内容: Tl; Dr-问题: 用Node.js处理将视频文件流传输到html5视频播放器以 使视频控件继续工作 的正确方法是什么 ? 我 认为 这与处理标头的方式有关。无论如何,这是背景信息。代码 有点 冗长,但是非常简单。 客户: 服务器: 但是此方法仅限于大小小于1GB的文件。 流式传输(任何大小)视频文件 通过利用,服务器可以读取流中的文件,而不是一次将其全部读取到内存中。这听起来像做事