java - 使用 Spring MVC 流媒体的正确方法是什么

标签 java spring-mvc controller

我有一个 Controller 方法,它只是将媒体(图像、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);
}

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

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

@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);
}

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

最佳答案

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

关于java - 使用 Spring MVC 流媒体的正确方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14005473/

相关文章:

java - Maven/Gradle设置编译环境变量?

java - 使用准备好的语句迭代 sql 结果集时出现 ArrayIndexOutOfBoundsException

java - 在 Spring 使用 AOP 进行日志记录?

java - Spring 将动态生成的值放入占位符中

javascript - 如何将复选框的值从 JavaScript/ View 传递到 MVC 中的 Controller ?

Java 数组列表错误?

java - 在 Bukkit 中使用多个类作为命令?

Spring security + i18n = 如何让它一起工作?

php - 从 CodeIgniter 中的 URL 中删除 Controller 名称

asp.net-mvc - 从业务层使用邮政库