2013-04-24 3 views
3

У меня есть следующий код: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-адресов:

Первый из них работает хорошо, но вторая дает 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) 

Что может быть причиной ошибки? Благодарю.

ответ

11

Метод ImageIO.read(URL) открывает URL-соединение с почти всеми настройками по умолчанию, включая свойство User-Agent (которое будет установлено в версии JVM, в которой вы работаете). По-видимому, сайт, который вы указали, ожидает более «стандартного» UA. Тестирование с помощью прямой связи телнета:

запроса, посланного ImageIO.read(url):

GET /newsimage/osteoderms-storing-minerals-helped-huge-dinosaurs-survive_3011.jpg HTTP/1.1
User-Agent: Java/1.7.0_17
Host: www.earthtimes.org
Accept: text/html, image/gif, image/jpeg, *; q=.2, /; q=.2
Connection: keep-alive

Код ответа на 404 (для меня по крайней мере), с text/html страницы по умолчанию возвращается.

запрос посланный 'стандартного' браузера:

GET /newsimage/osteoderms-storing-minerals-helped-huge-dinosaurs-survive_3011.jpg HTTP/1.1
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
Host: www.earthtimes.org
Accept: text/html, image/gif, image/jpeg, *; q=.2, /; q=.2
Connection: keep-alive

код ответа 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()); 
+0

большое спасибо. Ответ на вопрос: означает ли это, что сервер не хочет обслуживать нестандартный UA, чтобы его контент не использовался вне стандартного использования? или просто потому, что сервер настроен на поведение по умолчанию? –

+0

На самом деле, большинство серверных реализаций по умолчанию не являются черными списками UA. Более вероятно, что администраторы этого конкретного веб-сайта отказались от запрета Java-агентов. – Perception

+0

Меня беспокоят проблемы с авторским правом. Поэтому я беру его, если агенты Java черных списков admin могут означать, что их изображения нельзя использовать за пределами браузера. (В моем приложении пользователь может указать URL-адрес в качестве изображения профиля, и я храню указанное изображение, поэтому, если URL-адрес недоступен больше, изображение профиля будет по-прежнему доступно). Я не уверен, что мне придется помешать пользователю использовать изображение или просто предупредить их о возможном нарушении авторских прав. –