ImageIO.read()返回403错误

我有以下代码:

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

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

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

  • http://sofzh.miximages.com/java/logo4w.png
  • http://sofzh.miximages.com/java/osteoderms-storing-minerals-helped-huge-dinosaurs-survive_3011.jpg

第一个工作正常,但第二个给出403错误:

 Caused by: java.io.IOException: Server returned HTTP response code: 403 for URL: http://sofzh.miximages.com/java/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) 

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

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 = 0.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 = 0.2
连接:保持活力

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

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

 final String urlStr = "http://sofzh.miximages.com/java/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());