相关疑难解决方法(0)

Spring MVC:如何在@ResponseBody中返回图像?

byte[]从DB 获取图像数据(as ).如何返回此图片@ResponseBody

编辑

我没有@ResponseBody使用HttpServletResponseas方法参数我做了:

@RequestMapping("/photo1")
public void photo(HttpServletResponse response) throws IOException {
    response.setContentType("image/jpeg");
    InputStream in = servletContext.getResourceAsStream("/images/no_image.jpg");
    IOUtils.copy(in, response.getOutputStream());
}
Run Code Online (Sandbox Code Playgroud)

使用@ResponseBody注册org.springframework.http.converter.ByteArrayHttpMessageConverter转换器作为@Sid说对我不起作用:(.

@ResponseBody
@RequestMapping("/photo2")
public byte[] testphoto() throws IOException {
    InputStream in = servletContext.getResourceAsStream("/images/no_image.jpg");
    return IOUtils.toByteArray(in);
}
Run Code Online (Sandbox Code Playgroud)

spring-mvc

138
推荐指数
9
解决办法
17万
查看次数

是否有关闭的现有FileInputStream删除?

是否存在FileInputStream关闭时自动删除基础文件的现有方法?

我打算让自己的实用程序类扩展FileInputStream并自己完成,但我有点惊讶的是没有已经存在的东西.

编辑:用例是我有一个Struts 2动作,它返回InputStream一个页面的文件下载.据我所知,当动作完成或者FileInputStream不再使用时我没有得到通知,我不希望生成的(可能很大的)临时文件被遗留下来.

问题不是Struts 2特定的,所以我最初没有包含该信息并使问题复杂化.

java file-io temporary-files

21
推荐指数
3
解决办法
2万
查看次数

使用 Spring Framework 和 Chrome 设置视频流

我们正在编写一个 Spring 服务,它使 HTTP 端点可用,通过它可以流式传输来自 Amazon S3 存储的视频(或音频)文件。基本思想是,您可以在 Google Chrome 地址栏中输入一个 url,该服务将从 S3 中获取文件并进行流式传输,这样用户就可以立即开始观看,而无需等待下载完成,并且用户可以单击视频进度条中的随机位置并立即从该位置开始观看视频。

我理解这在理论上应该有效的方式是 Chrome 开始下载文件。该服务以 HTTP 200 响应并包含一个Accept-Ranges: bytes和一个Content-Length: filesize标头。这filesize是已知的,因为我们可以将其作为元数据从 S3 中查询,而无需获取整个文件。包含这些标头会导致浏览器取消下载,并再次请求带有Range: bytes=0-whatever标头的文件(whateverChrome 决定的块大小)。然后服务以 HTTP 206(部分内容)和请求的字节范围进行响应,我们可以轻松确定,因为 S3 支持相同的范围协议。Chrome 然后从服务请求连续的块,直到流结束。

在 Spring 方面,我们将数据发送到 a ResponseEntity<InputStreamResource>(根据这个 SO answer)。

然而,我们在实践中观察到,虽然 Chrome 在几百个字节后取消了它的第一个请求。但是,它会发送带有Range: bytes=0-标头的第二个请求,从而有效地请求整个文件。服务器以 HTTP 206 响应。结果,它只下载了几百字节的视频,并且视频显然没有开始播放。

有趣的是,在 Firefox 中一切正常。不幸的是,我们的应用程序需要支持 Chrome。我们是否遗漏了协议的某些部分?

spring http video-streaming spring-boot

8
推荐指数
1
解决办法
463
查看次数