【发布时间】: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 方式。我想知道为什么我尝试的前两件事不起作用,因为它们看起来更正确。另外,有没有我没有尝试过的方法实际上是正确的方法?
【问题讨论】:
-
<mvc:resources>注解有什么问题? -
这些是用户上传的文件,在文件系统中,不在我的网络应用程序中。
标签: java spring-mvc controller