为什么 "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] 实例。
好吧,我遇到了一个让我抓狂的问题!
我在 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] 实例。