如果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中的问题是其中有一个*。所以我尝试了以下解决方案,但没有成功:

  • 将*替换为\*
  • 用%2A替换*

我总是有以下错误:

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

那么我该如何下载图像呢?

谢谢你的帮助。

这个问题似乎与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());

相关内容

最新更新