【问题标题】:How to stream media content from Spring Boot endpoint for javascript client如何从 Spring Boot 端点为 javascript 客户端流式传输媒体内容
【发布时间】:2016-04-27 08:41:04
【问题描述】:

我有一个 spring boot rest 服务,其端点定义如下:

@RequestMapping(value = "...", method = RequestMethod.GET, produces = MediaType.IMAGE_JPEG_VALUE) //and octet for videos
@ResponseBody
public ResponseEntity<byte[]> get(...) {
   //get image as byte array and return
}

以及javascript中的客户端(角度):

var headers = {headers : {..., "Accept":"image/jpeg"}}
var response = $http.get(...);
obj.imageSrc = 'data:image/jpg;base64,' + response;
obj.Image = new Image();
obj.Image.src = obj.imageSrc;

我需要什么

我认为此端点的行为类似于文件服务器上的常规图像文件,以便客户端可以对其进行获取(由于此问题范围之外的原因,它实际上不能是要访问的原始图像带有网址)。显然情况并非如此 - 字节数组必须转换为 base64(有没有办法解决这个问题,因为数组变得更大),这具有旋转图像的效果。我错误地认为在 javascript 中从这样的 API 获取图像会很容易:(

其次,这样做意味着 javascript 必须下载整个数组。有没有一种方法可以定义端点以允许流,以便 javascript 可以分块获取它(我想 Spring 和 JS 都有可以处理这个的实用函数?)

基本问题

如何在 Spring 中正确实现这一点,以尽可能地对 Javascript 友好?请记住,我想同时提供图片(~5MB)和视频(~100MB)

提前致谢。

编辑 也许我应该使用 FileResourceStream 作为返回类型?不知道这是否是“正确”的方式。

【问题讨论】:

  • 为什么要在你的js中使用数据url?如果您将控制器的 url 直接用作 src,则不需要 base64 编码,并且可以返回“原始”字节.... 编辑:您应该让控制器方法目录写入响应输出流和返回无效..

标签: javascript java angularjs spring spring-boot


【解决方案1】:

1) 不要使用数据 url。使用你的控制器方法的直接 url。

2) 直接写入 http-response 的输出:

@RequestMapping(value = "/dyna.jpg", method = RequestMethod.GET, produces = MediaType.IMAGE_JPEG_VALUE)
public void getImage(HttpServletResponse response) {
    //write byte-array or -stream to the response using
    // response.getOutputStream() 
}

附:如果你真的需要数据 url,那么你就别无他法了,因为它们需要 base64 编码

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-10
    • 1970-01-01
    • 2018-01-30
    • 1970-01-01
    • 2023-02-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多