为什么" ImageIO.read(URL输入)"在Weblogic 12c上的一些图像上失败了吗?

时间:2015-03-22 09:40:10

标签: java image weblogic bufferedimage javax.imageio

好吧,我有一个让我疯狂的问题!

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

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

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

上一行在某些图片上失败,并带有以下愚蠢的消息:

For input string: ""

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

-DUseSunHttpHandler=true

它解决了问题但我无法实施此解决方案,因为它会非常危险。

让我更加疯狂的是,当我使用" Paint"修改图片时,添加/删除一些虚拟颜色和/或形状,它就过去了!!

(虽然并非所有更改都会通过)。

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

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)

2 个答案:

答案 0 :(得分:0)

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

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

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

由此看来,使用-DUseSunHttpHandler=true开关或升级WebLogic似乎是最好的选择。或者,您可以尝试按上面所述读取字节,并忽略来自IOException的{​​{1}}(但可能存在数据确实已损坏,因此这不是100%简单的证明)

答案 1 :(得分:0)

由于我现在几乎可以肯定它是一个WebLogic Bug,我重写了代码:

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]实例。