java - 如果 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());
推荐阅读
- c# - Entity Framework Core FromSql 模拟测试用例
- javascript - 如何从 HTML 源代码限制编辑 HTML 按钮的“禁用”属性
- apache-flink - Flink Job 突然崩溃并报错:Encountered error while sumption partitions
- c - typedef 结构定义末尾的变量声明
- bash - 带有拆分终端窗口的 Bash 脚本:一侧用于进度/提示,另一侧用于详细输出
- java - 如何避免重复节点?
- hive - 如何将一个分区的数据插入/复制到配置单元中的多个分区?
- uwp - 在文本框中显示日期 [UWP]
- amazon-web-services - 将 AWS Polly mp3 文件保存到 S3
- python - 数据框 iloc 在熊猫中意外工作