2013-04-24 2 views
3

나는 다음과 같은 코드가 있습니다 : 주어진 URL에서 이미지를 반환하도록되어ImageIO.read()가 403 오류를 반환

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

.

I이 두 임의로 선택된 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) 메서드는 User-Agent 속성 (실행중인 JVM 버전으로 설정 됨)을 포함하여 거의 모든 기본 설정으로 URL 연결을 엽니 다. 분명히 나열된 사이트는보다 '표준'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 에이전트를 블랙리스트에 추가하면 이미지가 브라우저 외부에서 사용될 수 없음을 의미 할 수 있습니다. (내 앱에서 사용자는 프로필 이미지로 URL을 제공 할 수 있으며 URL을 사용할 수없는 경우 이미지를 저장합니다. 프로필 이미지는 더 이상 사용할 수 없습니다. 나는 사용자가 이미지를 사용하지 못하게하거나 저작권 침해 가능성에 대해 경고해야하는지 여부를 확신하지 못한다. –

관련 문제