问题描述
我有以下代码:
public BufferedImage urlToImage(String imageUrl) throws MalformedURLException, IOException {
URL url = new URL(imageUrl);
BufferedImage image = ImageIO.read(url);
return image;
}
这应该从给定的 URL 返回图像.
That is supposed to return an image from a given URL.
我用这两个随机选择的 URL 进行了测试:
I tested with these two randomly chosen URLs:
- https://www.google.co.ma/images/srpr/logo4w.png
- http://www.earthtimes.org/newsimage/osteoderms-storing-minerals-helped-huge-dinosaurs-survive_3011.jpg
第一个工作正常,但第二个给出了 403 错误:
The first one works fine, but the second gives a 403 error:
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)
错误的原因可能是什么?谢谢.
What could be the cause of the error ? Thanks.
推荐答案
ImageIO.read(URL)
方法使用几乎所有默认设置打开 URL 连接,包括 User-Agent
属性(将设置为您正在运行的 JVM 版本).显然,您列出的站点需要更标准"的 UA.使用直接 telnet 连接进行测试:
The ImageIO.read(URL)
method opens a URL connection with pretty much all default settings, including the User-Agent
property (which will be set to the JVM version you are running on). Apparently, the site you listed expects a more 'standard' UA. Testing with a straight telnet connection:
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
接受:文本/html、图像/gif、图像/jpeg、*;q=.2, /;q=.2
连接:保持连接
响应代码是 404(至少对我而言),返回一个默认的 text/html
页面.
标准"浏览器发送的请求:
Request sent by 'standard' browser:
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
接受:文本/html、图像/gif、图像/jpeg、*;q=.2, /;q=.2
连接:保持连接
响应代码是 200,带有图像数据.
以下简单的修复延长了您的代码,但通过设置更标准"的 UA 解决了问题:
The following simple fix lengthens your code, but gets around the problem, by setting a more 'standard' 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());
这篇关于ImageIO.read() 返回 403 错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!