首页 > 解决方案 > 如果 url 包含特殊字符,Java ImageIO.read() 会崩溃

问题描述

在我的 Java 应用程序中,我想使用以下内容下载图像:

ImageIO.read(new URL("https://www.example.com/example.png"))

它大部分时间都可以正常工作,除了这个网址:https ://cdn-images-1.medium.com/max/1200/1*XSCC_nLOSp1VJ6wXeANgCQ.png

url中的问题是其中有一个*。所以我尝试了以下解决方法,但没有任何成功:

我总是有以下错误:

javax.imageio.IIOException: Can't get input stream from URL!
at javax.imageio.ImageIO.read(ImageIO.java:1395)

那怎么下载图片呢?

谢谢你的帮助。

标签: javajavax.imageio

解决方案


该问题似乎与 Java 8 相关,在 Java 11 中已修复。Java 8 的问题是返回了 HTTP 403 代码。

Caused by: java.io.IOException: Server returned HTTP response code: 403 for URL: https://cdn-images-1.medium.com/max/1200/1*XSCC_nLOSp1VJ6wXeANgCQ.png
at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1894)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1492)
at sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:263)
at java.net.URL.openStream(URL.java:1045)
at javax.imageio.ImageIO.read(ImageIO.java:1393)

为了解决这个问题,我们需要设置用户代理标头。

URL url = new URL("https://cdn-images-1.medium.com/max/1200/1*XSCC_nLOSp1VJ6wXeANgCQ.png");
URLConnection connection = url.openConnection();
connection.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.95 Safari/537.11");
connection.connect();
BufferedImage bufferedImage = ImageIO.read(connection.getInputStream());

推荐阅读