为什么 "ImageIO.read(URL input)" 在 Weblogic 12c 上的某些图像上失败?

Why does "ImageIO.read(URL input)" fail on some images on Weblogic 12c?

好吧,我遇到了一个让我抓狂的问题!

我在 Weblogic 12.1.1 上部署了一个 Web 应用程序 - 即:Weblogic 12c

在某些时候,我想使用以下方法读取图像文件:

BufferedImage templateImage = ImageIO.read(new URL(url));

上一行在 一些 图像上失败,并显示以下如此愚蠢的消息:

For input string: ""

有人建议我使用以下参数更改 Weblogic 的 HTTP 处理程序:

-DUseSunHttpHandler=true

它解决了问题,但我无法实施此解决方案,因为它风险很大。

更让我疯狂的是,当我用"Paint",adding/removing一些虚拟颜色and/or形状修改图片时,它通过了!!

(虽然不是所有的改变都会让它通过)。

这是我的第一个问题,非常感谢您的帮助。

P.S.: 问题只出现在 "Weblogic 12c",而不是 11g 或其他任何东西。

编辑:下面是堆栈跟踪:


java.io.IOException: For input string: ""
        at weblogic.utils.http.HttpChunkInputStream.initChunk(HttpChunkInputStre
am.java:69)
        at weblogic.utils.http.HttpChunkInputStream.skip(HttpChunkInputStream.ja
va:215)
        at weblogic.utils.http.HttpChunkInputStream.skipAllChunk(HttpChunkInputS
tream.java:395)
        at weblogic.utils.http.HttpChunkInputStream.close(HttpChunkInputStream.j
ava:291)
        at weblogic.net.http.KeepAliveStream.close(KeepAliveStream.java:122)
        at javax.imageio.ImageIO.read(ImageIO.java:1405)

堆栈跟踪显示 ImageIO.read(...) 实际上已完成读取图像(可能是一张好图像,可能是它不起作用),并且正在关闭流...

堆栈跟踪还显示问题是由 WebLogic class HttpChunkInputStream 引起的。因此,它似乎是 WebLogic 中的一个错误,在处理 chunked transfer encoding 时(请注意,它 可能 也可能是您要连接的服务器在其分块中有一个错误传输编码)。

当您在 Paint 中修改图像时,一个副作用是它可能会使图像变小几个字节或变大几个字节,因此您不会遇到错误。

由此看来,使用 -DUseSunHttpHandler=true 开关或升级 WebLogic 似乎是最好的选择。或者,您可以尝试自己将 URL 中的内容读取到字节数组中,然后使用 ImageIO.read(new ByteArrayInputStream(bytes)) 将问题缩小到网络或图像读取。您也可以忽略 close() 中的 IOException(但可能数据确实已损坏,因此这不是 100% 的万无一失)。

因为我现在几乎可以肯定这是一个 WebLogic 错误,所以我将代码重写为:

URL url = new URL("url")
File file = new File("New File Path");
InputStream inputStream = url.openStream();
OutputStream outputStream = new FileOutputStream(file);
        try {
            IOUtils.copy(inputStream, outputStream);
        } finally {
            outputStream.close();
            inputStream.close();
}
BufferedImage actualImage = ImageIO.read(file);

新代码的主要区别在于它向 read() 方法传递了一个 [File] 实例而不是 [URL] 实例。