【问题标题】:Doesn't accept Spring MVC ResponseEntity<Resource> an ImputStreamResource?不接受 Spring MVC ResponseEntity<Resource> 一个 ImputStreamResource?
【发布时间】:2011-11-08 10:41:23
【问题描述】:

我正在尝试使用 ResponseEntity&lt;Resource&gt; 作为控制器方法响应类型,使用 Spring MVC 发送 jpg 图像。

如果资源是FileSystemResource,它可以正常工作,但是当我尝试使用InputStreamResource 时,ResourceHttpMessageConverter 询问内容长度,InputStreamResource 抛出异常(来自AbstractResource 方法,因为没有任何要读取长度的文件)。如果方法返回 nullResourceHttpMessageConverter 将继续。

有没有其他方法可以将InputStream 用作ResourceResponseEntity

【问题讨论】:

    标签: image spring spring-mvc response inputstream


    【解决方案1】:

    例如,您可以将其复制到字节数组中(或直接使用输入流——我没有用输入流测试过)。

    @RequestMapping(value = "/{bid}/image", method = RequestMethod.GET)
    public HttpEntity<byte[]> content(@PathVariable("bid") final MyImage image) {
    
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(...);
        headers.setContentLength(image.getSize());
    
        return new HttpEntity<byte[]>(this.image.getContentAsByteArray(), headers);
    }
    

    提示:对于 10MB 以上的大内容,设置 ContentLength 很重要。如果您错过了某些浏览器将无法正确下载它。 (在没有 ContentLength 的情况下它工作的确切文件大小取决于浏览器)

    【讨论】:

    • 谢谢,InputStream不能直接使用。没有HttpMessageConverter。而且使用字节数组不会增加内存使用吗?
    • 1) 所以你可以添加你自己的HttpMessageConter。 - 2)因为无论如何都必须加载文件内容(而且我不希望它以流的方式实现)它应该没有相关的区别。
    【解决方案2】:

    试试这个:

    return ResponseEntity.ok()
                .header(HttpHeaders.CONTENT_DISPOSITION, "attachment;filename=filename.jpg")
                .contentLength(length)
                .contentType(MediaType.APPLICATION_OCTET_STREAM_VALUE)
                .body(new InputStreamResource(inputStream));
    

    【讨论】:

      猜你喜欢
      • 2020-05-23
      • 2017-04-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-05
      • 1970-01-01
      • 2013-04-26
      相关资源
      最近更新 更多