ImageIO.read()返回403错误(ImageIO.read() returns 403 e

2019-09-01 00:07发布

我有以下代码:

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

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

我与这两个随机选择的网址进行测试:

  • https://www.google.co.ma/images/srpr/logo4w.png
  • http://www.earthtimes.org/newsimage/osteoderms-storing-minerals-helped-huge-dinosaurs-survive_3011.jpg

第一个工作正常,但第二个给出了一个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)

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

Answer 1:

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的,图像/ GIF,图像/ JPEG,*; Q = 0.2,/; Q = 0.2
连接:保持活跃

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

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

GET /newsimage/osteoderms-storing-minerals-helped-huge-dinosaurs-survive_3011.jpg HTTP / 1.1
用户代理:Mozilla的/ 5.0(Macintosh上;英特尔的Mac OS X 10_7_5)为AppleWebKit / 537.31(KHTML,例如Gecko)铬/ 26.0.1410.65 Safari浏览器/ 537.31
主持人:www.earthtimes.org
接受:text / html的,图像/ GIF,图像/ JPEG,*; Q = 0.2,/; Q = 0.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());


文章来源: ImageIO.read() returns 403 error