我正在使用 Spring-MVC,我需要将 MP4 文件发送回用户。当然,MP4 文件的大小非常大(> 2 GB)。
我找到了这个帖子 Downloading a file from spring controllers ,它展示了如何流回二进制文件,理论上这应该适合我的情况。不过,我关心的是效率。
在一种情况下,答案可能意味着将所有字节加载到内存中。
byte[] data = SomeFileUtil.loadBytes(new File("somefile.mp4"));
在另一种情况下,答案建议使用 IOUtils。
InputStream is = new FileInputStream(new File("somefile.mp4"));
OutputStream os = response.getOutputStream();
IOUtils.copy(is, os);
我想知道这些中的任何一个是否比简单地定义资源映射更具内存效率?
<resources mapping="/videos/**" location="/path/to/videos/"/>
资源映射可能会起作用,但我需要保护对这些视频的所有请求,并且我认为资源映射不会适合保护内容的逻辑。
还有其他方法可以流回二进制数据(即 MP4)吗?我想要一些内存效率高的东西。
最佳答案
我认为定义资源映射将是处理它的最干净的方法。关于保护访问,您可以简单地将/videos/** 添加到您的安全配置中,并通过类似
之类的方式定义您允许的访问权限 <security:intercept-url pattern="/videos/**" access="ROLE_USER, ROLE_ADMIN"/>
或您想要的任何访问权限。
此外,您还可以考虑将这些大型 mp4 保存到云存储和/或 CDN,例如 Amazon S3(带或不带 CloudFront)。
然后您可以生成唯一的网址,只要您想要它们,它们就会持续存在。然后,下载由 Amazon 处理,而不必使用 Web 服务器的计算能力、数据空间和内存来提供大型资源文件。另外,如果您使用 CloudFront 之类的工具,您可以将其配置为流式传输而不是下载。
关于java - 有没有更有效的方法将 mp4 文件发送给用户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23447901/