【问题标题】:What is proper way to stream media with Spring MVC使用 Spring MVC 流媒体的正确方法是什么
【发布时间】:2012-12-22 18:36:26
【问题描述】:

我有一个控制器方法,它只是将媒体(图像、css、js 等)的字节流传输到客户端。我首先尝试过这样的事情:

@RequestMapping(value="/path/to/media/**", method=RequestMethod.GET)
@ResponseBody
public byte[] getMedia(HttpServletRequest request) throws IOException
{
    //logic for getting path to media on server

    return Files.readAllBytes(Paths.get(serverPathToMedia));
}

我最初在 Firefox 中对此进行了测试,并且似乎一切正常。但是,我随后在 Chrome 中尝试了它,然后发现所有图像都不起作用。所以,然后我把它改成这样:

@RequestMapping(value="/path/to/media/**", method=RequestMethod.GET)
public ResponseEntity<byte[]> getMedia(HttpServletRequest request) throws IOException
{
    //logic for getting path to media on server

    byte[] bytes = Files.readAllBytes(Paths.get(serverPathToMedia));
    //logic for setting some header values like Content-Type and Content-Length
    return new ResponseEntity<byte[]>(bytes, headers, HttpStatus.OK);
}

这给出了与以前相同的结果。我在开发人员工具中看到我的响应标头按预期下降,但仍然没有图像字节

接下来我尝试了这样的事情:

@RequestMapping(value="/path/to/media/**", method=RequestMethod.GET)
public void getMedia(HttpServletRequest request, HttpServletResponse response) throws IOException
{
    //logic for getting path to media on server

    byte[] bytes = Files.readAllBytes(Paths.get(serverPathToMedia));
    response.getOutputStream().write(bytes);
}

甚至无需设置任何响应标头,这适用于 Firefox 和 Chrome。现在,虽然我可以这样做,因为它可以工作,但这似乎不是正确的 Spring MVC 方式。我想知道为什么我尝试的前两件事不起作用,因为它们看起来更正确。另外,有没有我没有尝试过的方法实际上是正确的方法?

【问题讨论】:

标签: java spring-mvc controller


【解决方案1】:

您的最后一种方法几乎就是解决方法。我可以建议的唯一更改是不要将整个内容文件保留在内存中流式传输,而是通过缓冲流式传输内容 - 来自 Apache commons 的 IOUtils 可以为您做到这一点。

【讨论】:

  • 你能举个例子,为什么 mvc 资源在这里不起作用?我认为css和js文件不需要特殊处理。
  • 哦,是的,出于某种原因,我认为目标是从特定位置流式传输特定于应用程序的文件,而不是像 js、img 这样的内容,就像我现在意识到的那样。请将其添加为答案,我会 +1 :-)
  • 我真的不想将响应作为参数添加到此控制器方法中。如果必须,我必须,但为什么前两种方法不起作用?
  • 前两种方法的问题是它们将整个文件内容保存在内存中。假设这对您来说没问题,响应类型由 HttpMessageConverter 进一步作用,以根据来自客户端的原始 Accept 标头编组自定义类型 - 不完全确定如何为您处理 byte[] 响应。如果静态资源位于固定位置,您可以尝试像鲍里斯建议的那样使用&lt;mvc:resources&gt;。
  • 我简要地查看了 HttpMessageConverter 的东西,我宁愿直接写到响应中,而不是必须搞砸所有这些。感谢您和@BorisTreukhov 的帮助。
猜你喜欢
  • 2015-09-29
  • 1970-01-01
  • 2012-12-31
  • 2014-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-19
  • 2022-01-20
相关资源
最近更新 更多