如何在Java中从URL下载图像?

5
我一直在尝试通过Java从URL下载图像。我尝试了很多种方法,但都没有成功。
我写下我的方法,希望有人能找出哪里出错了:
使用第一种和第二种方法时,在我尝试打开图像时会出现以下错误:
“...文件似乎已损坏、损坏或太大”
而且它的大小比应该的要小。
我猜这与编码有关。
第一种方式:
URL url = new URL("http://www.avajava.com/images/avajavalogo.jpg");
InputStream in = url.openStream();
Files.copy(in, Paths.get("someFile.jpg"), StandardCopyOption.REPLACE_EXISTING);
in.close();

第二种方法:
File f= new File("c:\\image.jpg");
URL myUrl = new URL("http://www.avajava.com/images/avajavalogo.jpg");
FileUtils.copyURLToFile(myUrl, f);

第三种方式:

通过第三种方式,我在主线程中得到了一个异常:thread "main" java.lang.IllegalArgumentException: image == null!

URL url = new URL("http://www.avajava.com/images/avajavalogo.jpg");
BufferedImage img = ImageIO.read(url);
File file = new File("downloaded.jpg");
ImageIO.write(img, "jpg", file);

我非常需要你的帮助!!! 我一直在尝试解决这个问题,但一直没有成功。

提前感谢你!!!


请查看这个链接。这将对您有所帮助。 - Ibrahim Ali Khan
2
第一种方法在我的这边可行。 - Nicolas Filotto
请在此处附上您从第一个案例下载的文件,以便我们验证它是否真的已经损坏。另外,我建议通过其他方式下载该文件,并对其与通过 Java 下载的文件进行比较,以查看它们之间的区别。 - Ivan
一张图片只是二进制内容,没有其他的。知道这一点后,第一个将适用于任何类型的内容(二进制或非二进制),也将适用于图片。 - Nicolas Filotto
我唯一能提出的建议是使用try-with-resources语句来关闭您的流,无论发生什么情况,就像这个答案https://dev59.com/VG025IYBdhLWcg3wpXse#32472138。 - Nicolas Filotto
可能是重复的问题:如何使用Java从互联网下载和保存文件? - Robin Green
2个回答

10

在第三种方式中,您必须指定目标文件的完整位置:

URL url = new URL("http://www.avajava.com/images/avajavalogo.jpg");
BufferedImage img = ImageIO.read(url);
File file = new File("D:\\image\\downloaded.jpg");
ImageIO.write(img, "jpg", file);

-1

当出现这种情况时,通常你试图下载的图片位于占位符内。占位符用于在所有浏览器或任何有价值的方法中为图像提供漂亮的黑色背景。

尝试使用任何文本编辑器打开其中一个已下载的小尺寸图像。你可能会惊讶地看到你所谓的图像内部包含HTML代码。这个HTML代码将有几行,通常是一个背景颜色标签和图像真实URL。这就是你必须在你的代码中包含的URL,以便下载完整的图像。

这可能是你实际下载的avajavalogo.jpg文件的示例:

<!DOCTYPE html>
<html>
<body style="background-color:#0e0e0e;">
<center><img src="http://www.myhostsiteisgreat.com/image_real_location_url/awesome_image.jpg" border="0" onclick="Javascript: window.close();" alt="Click on image to close it."></center>
</body>
</html>

如果您尝试使用图像编辑器打开此文件,它将抛出错误(错误的标头、错误的格式等),并且图像将无法打开。这不是您在问题中展示的图像的情况,但可能是您实际尝试下载的图像的情况。

除此之外,所提供的方法是有效的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接