用java下载的文件太小

时间:2019-01-15 16:48:03

标签: java android

我使用此代码段下载了一些mp3文件:

File target = /*...*/;
InputStream in = new URL(link).openStream();
Files.copy(in, target.toPath(), StandardCopyOption.REPLACE_EXISTING);

它通常可以正常工作,但是现在我有一系列文件,它们太小了,无法使用。例如:https://kritisches-denken-podcast.de/wp-content/uploads/2019/01/KDP-Episode-17-Selbsterhaltungstherapie.mp3应该约为46MB(当我通过浏览器下载时),但是当我在Android上使用上述代码下载时,它只有315字节。

1 个答案:

答案 0 :(得分:0)

URL内置了重定向。通常,此类重定向(尤其是针对非浏览器的URL(显然是mp3 URL))被用作HTTP 301“永久移动”(有时是302“临时移动”),并且在Location标头。您看到的文本(您下载的315字节)仅仅是“后备” HTML,它也表明内容已移动。幸运的是,没有必要对此进行解析。

URL的openStream代码的HTTP“浏览器”非常基础,并且不遵循重定向。您需要有一个API。 URLConnection(也来自核心库)可以做到这一点,但是如果重定向从http切换到https,反之亦然,它就不会跟随重定向,因此您可能不想这样做。以防万一:

File target = /*...*/;
HttpURLConnection con = (HttpURLConnection) new URL(link).openConnection();
con.setInstanceFollowRedirects(true);
try (InputStream in = con.getInputStream()) {
    Files.copy(in, target.toPath(), StandardCopyOption.REPLACE_EXISTING);
}

如果上述方法不好(大概是由于HTTP / HTTPS重定向问题),我建议选择一个标准的API不能提供的真实HTTP客户端。我建议OkHttp