ImageIO.read()返回403错误

问题描述

ImageIO.read(URL)方法将打开具有几乎所有默认设置的URL连接,包括User- Agent属性(该属性将被设置为您正在运行的JVM版本)。显然,您列出的网站希望使用更“标准”的UA。使用直接的telnet连接进行测试:

请求发送者ImageIO.read(url)

GET /newsimage/osteoderms-storing-minerals-helped-huge-dinosaurs- survive_3011.jpg HTTP / 1.1 用户代理:Java / 1.7.0_17主机:www.earthtimes.org 接受:text / html,image / gif,image / jpeg,*;q = .2, / ; q = .2 连接:保持活动状态

响应代码404(至少对我来说),并text/html返回默认页面

“标准”浏览器发送的请求:

GET /newsimage/osteoderms-storing-minerals-helped-huge-dinosaurs- survive_3011.jpg HTTP / 1.1 用户代理:Mozilla / 5.0(Macintosh; Intel Mac OS X 10_7_5)AppleWebKit / 537.31(KHTML,例如Gecko)Chrome / 26.0 .1410.65 Safari / 537.31主机:www.earthtimes.org 接受:text / html,image / gif,image / jpeg,*;q = .2, / ; q = .2 连接:保持活动状态

响应码为200,带有图像数据。

以下简单修复程序通过设置更“标准”的UA来延长代码长度,但可以解决问题:

final String urlStr = "http://www.earthtimes.org/newsimage/osteoderms-storing-minerals-helped-huge-dinosaurs-survive_3011.jpg";
final URL url = new URL(urlStr);
final HttpURLConnection connection = (HttpURLConnection) url
        .openConnection();
connection.setRequestProperty(
    "User-Agent",
    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_5) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.65 Safari/537.31");
final BufferedImage image = ImageIO.read(connection.getInputStream());

解决方法

我有以下代码:

public BufferedImage urlToImage(String imageUrl) throws MalformedURLException,IOException {
    URL url = new URL(imageUrl);
    BufferedImage image = ImageIO.read(url);
    return image;
}

那应该从给定的URL返回图像。

我测试了以下两个随机选择的URL:

第一个可以正常工作,但是第二个却出现403错误:

Caused by: java.io.IOException: Server returned HTTP response code: 403 for URL: http://www.earthtimes.org/newsimage/osteoderms-storing-minerals-helped-huge-dinosaurs-survive_3011.jpg
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1436)
at java.net.URL.openStream(URL.java:1010)
at javax.imageio.ImageIO.read(ImageIO.java:1367)

错误的原因可能是什么?谢谢。

猜你在找的技术问答相关文章

如何检查配对的蓝牙设备是打印机还是扫描仪(Android)
是否允许实体正文进行HTTP DELETE请求?
如何将ZipInputStream转换为InputStream?
java.util.logging Java 8中的变量
PowerMockito.doReturn返回null
Java中的RESTful调用
Swing / Java:如何正确使用getText和setText字符串
特殊字符和重音字符
Android Studio中的ndk.dir错误
错误“找不到主类”