【问题标题】:Spring RestTemplate - I/O error reading PNG headerSpring RestTemplate - 读取 PNG 标头的 I/O 错误
【发布时间】:2014-11-20 18:28:32
【问题描述】:

我正在对外部应用程序进行 API 调用(该应用程序将所有最初加载到其中的图像转换为 PNG)。 如果图像最初是作为 PNG 加载到该应用程序中的,那么 RestTemplate 可以得到它。如果它最初是作为其他内容加载的,然后转换为 PNG,则以下代码在 Spring 4.1.1 中尝试使用 RestTemplate 获取它时会引发错误。图像在外部应用程序上显示良好。

原因:javax.imageio.IIOException: I/O error reading PNG header! 在 com.sun.imageio.plugins.png.PNGImageReader.readHeader(PNGImageReader.java:315) ~[na:1.8.0_20] 在 com.sun.imageio.plugins.png.PNGImageReader.readMetadata(PNGImageReader.java:654) ~[na:1.8.0_20] 在 com.sun.imageio.plugins.png.PNGImageReader.readImage(PNGImageReader.java:1248) ~[na:1.8.0_20] 在 com.sun.imageio.plugins.png.PNGImageReader.read(PNGImageReader.java:1606) ~[na:1.8.0_20] 在 org.springframework.http.converter.BufferedImageHttpMessageConverter.read(BufferedImageHttpMessageConverter.java:174) ~[BufferedImageHttpMessageConverter.class:4.1.1.RELEASE] 在 org.springframework.http.converter.BufferedImageHttpMessageConverter.read(BufferedImageHttpMessageConverter.java:67) ~[BufferedImageHttpMessageConverter.class:4.1.1.RELEASE] 在 org.springframework.web.client.HttpMessageConverterExtractor.extractData(HttpMessageConverterExtractor.java:104) ~[HttpMessageConverterExtractor.class:4.1.1.RELEASE] 在 org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:576) ~[RestTemplate.class:4.1.1.RELEASE] ...省略了74个常用框架 原因:javax.imageio.IIOException:错误的 PNG 签名! 在 com.sun.imageio.plugins.png.PNGImageReader.readHeader(PNGImageReader.java:242) ~[na:1.8.0_20]

BufferedImage image = restTemplate.getForObject(getPhotoUrl(), BufferedImage.class, Collections.EMPTY_MAP);

【问题讨论】:

  • 您可以将spring的日志级别设置为DEBUG,这样您就可以看到问题的更多细节。此外,如果您粘贴整个堆栈跟踪,对读者会更有帮助。尤其是堆栈跟踪的“原因:”部分对于理解潜在问题非常重要。
  • 添加所有调用代码和对象类代码,这将有助于进一步调试您的问题
  • 您并没有真正解释图像发生了什么,但错误提示:您得到的不是有效的 PNG 图像。直接从转换应用下载它,并控制它的真正格式。

标签: spring spring-mvc resttemplate


【解决方案1】:

不是使用getForObject方法来获取BufferedImage,而是使用exchange方法来获取字节数组。具有错误 PNG 标头的图像现在会显示在浏览器中。

//Set HttpHeaders object
List<MediaType> acceptableMediaTypes = new ArrayList<>();
acceptableMediaTypes.add(MediaType.IMAGE_PNG);
HttpHeaders headers = new HttpHeaders();
headers.setAccept(acceptableMediaTypes);

//Get image from external app with API call
ResponseEntity<byte[]> responseEntity = restTemplate.exchange(getPhotoUrl(), HttpMethod.GET, new HttpEntity<byte[]>(headers), byte[].class);
byte[] image = responseEntity.getBody();

//Display image in browser
if(image != null) {
    InputStream in = new ByteArrayInputStream(image);
    BufferedImage bImageFromConvert = ImageIO.read(in);

    if(bImageFromConvert != null) {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        ImageIO.write(bImageFromConvert, "png", baos);
        byte[] data = baos.toByteArray();
        response.setContentType(MediaType.IMAGE_PNG_VALUE);
        response.getOutputStream().write(data);
    }
}

【讨论】:

    猜你喜欢
    • 2017-05-26
    • 1970-01-01
    • 2015-08-02
    • 2019-01-21
    • 2015-09-15
    • 2015-11-26
    • 2015-09-17
    • 2021-09-11
    • 2019-08-29
    相关资源
    最近更新 更多