是否有更有效的方式向用户发送mp4文件

时间:2014-05-03 17:47:55

标签: java spring spring-mvc spring-security mp4

我正在使用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)的方法吗?我喜欢内存效率高的东西。

2 个答案:

答案 0 :(得分:1)

我认为定义资源映射将是处理它的最简洁方法。关于保护访问,您只需将/ videos / **添加到您的安全配置中,并通过类似

的内容定义您允许的访问权限。

<security:intercept-url pattern="/videos/**" access="ROLE_USER, ROLE_ADMIN"/>

或您想要的任何访问权限。

此外,您可以考虑将这些大型mp4保存到云存储和/或CDN(例如Amazon S3)(我们没有CloudFront)。

然后,您可以生成唯一的网址,只要您愿意,网址就会持续存在。然后下载由亚马逊处理,而不是必须使用Web服务器的计算能力,数据空间和内存来提供大型资源文件。此外,如果您使用CloudFront之类的东西,则可以将其配置为流式而非下载。

答案 1 :(得分:1)

将整个文件加载到内存中会更糟糕,并且使用更多内存并且不可扩展。在您加载所有数据之前,您不会传输任何数据,这会增加所有延迟。

相关问题