5

次のコードがあります。

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

これは、指定された URL から画像を返すことになっています。

ランダムに選択した次の 2 つの URL でテストしました。

最初のものは問題なく動作しますが、2 つ目は 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

このメソッドは、 (実行している JVM バージョンに設定される) プロパティImageIO.read(URL)を含むほとんどすべてのデフォルト設定で URL 接続を開きます。User-Agentどうやら、あなたがリストしたサイトは、より「標準的な」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
Accept: 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());
于 2013-04-24T09:40:07.113 に答える