【问题标题】:Why does "ImageIO.read(URL input)" fail on some images on Weblogic 12c?为什么“ImageIO.read(URL 输入)”在 Weblogic 12c 上的某些图像上失败?
【发布时间】:2015-05-25 10:01:31
【问题描述】:

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

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

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

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)

【问题讨论】:

  • 该错误消息是否有堆栈跟踪?另外,请注意,使用ImageIO.read(URL) 将使用URL.openStream() 创建一个InputStream 来读取。您可以尝试自己将 URL 中的内容读取到字节数组中,然后使用 ImageIO.read(new ByteArrayInputStream(bytes)) 将问题缩小到网络或图像读取。
  • 感谢您的回复,我已经在上面添加了堆栈跟踪。值得一提的是,当我尝试为图像文件构造一个 File 对象并将其传递给“读取”方法时,它起作用了!
  • 是的,这很可能是一个 Weblogic 错误,将尝试其中一种替代方案,非常感谢。

标签: java image weblogic bufferedimage javax.imageio


【解决方案1】:

堆栈跟踪显示ImageIO.read(...) 实际上已经完成了对图像的读取(可能是一个很好的图像,也可能是它没有工作),并且正在关闭流...

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

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

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

【讨论】:

    【解决方案2】:

    因为我现在几乎可以确定这是一个 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);
    

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

    【讨论】:

      猜你喜欢
      • 2019-03-12
      • 1970-01-01
      • 1970-01-01
      • 2013-06-22
      • 2011-04-04
      • 2016-05-04
      • 2018-02-20
      • 1970-01-01
      • 2013-08-22
      相关资源
      最近更新 更多