5

我有以下代码:

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)

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

4

1 回答 1

16

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, like 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());
于 2013-04-24T09:40:07.113 回答