我正在使用Spring-MVC,我需要将MP4文件发送回用户。当然,MP4文件的大小非常大(> 2 GB)。
我找到了这个SO线程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)的方法吗?我喜欢内存效率高的东西。
答案 0 :(得分:1)
我认为定义资源映射将是处理它的最简洁方法。关于保护访问,您只需将/ videos / **添加到您的安全配置中,并通过类似
的内容定义您允许的访问权限。 <security:intercept-url pattern="/videos/**" access="ROLE_USER, ROLE_ADMIN"/>
或您想要的任何访问权限。
此外,您可以考虑将这些大型mp4保存到云存储和/或CDN(例如Amazon S3)(我们没有CloudFront)。
然后,您可以生成唯一的网址,只要您愿意,网址就会持续存在。然后下载由亚马逊处理,而不是必须使用Web服务器的计算能力,数据空间和内存来提供大型资源文件。此外,如果您使用CloudFront之类的东西,则可以将其配置为流式而非下载。
答案 1 :(得分:1)
将整个文件加载到内存中会更糟糕,并且使用更多内存并且不可扩展。在您加载所有数据之前,您不会传输任何数据,这会增加所有延迟。