我正在使用此代码从网址下载文件:
FileUtils.copyURLToFile(url, new File("C:/Songs/newsong.mp3"));
当我使用例如创建网址时, “https://mjcdn.cc/2/282676442/MjUgU2FhbCAtIFZlZXQgQmFsaml0Lm1wMw==”, 这工作得很好,下载了mp3。 然而, 如果我使用其他网址: “https://dl.jatt.link/hd.jatt.link/a0339e7c772ed44a770a3fe29e3921a8/uttzv/Hummer-(Mr-Jatt.com).mp3”, 该文件是0kb。
我可以从网络浏览器中下载这两个网址中的文件。 这里有什么问题,我该如何解决呢。
答案 0 :(得分:1)
我注意到您的2个网址之间存在差异:
HTTP/1.1 302 Moved Temporarily
)。这也是一种特殊情况,因为它是从HTTPS到HTTP协议的重定向。浏览器可以遵循重定向,但是您的程序 - 出于某种原因(见下文) - 不能。
我建议您使用HTTP客户端库(例如Apache HTTP client或Jsoup),并将其配置为遵循重定向(如果他们默认情况下不这样做)。
例如,使用Jsoup,您需要这样的代码:
String url = "https://dl.jatt.link/hd.jatt.link/a0339e7c772ed44a770a3fe29e3921a8/uttzv/Hummer-(Mr-Jatt.com).mp3";
String filename = "C:/Songs/newsong.mp3";
Response r = Jsoup.connect(url)
//.followRedirects(true) // follow redirects (it's the default)
.ignoreContentType(true) // accept not just HTML
.maxBodySize(10*1000*1000) // accept 10M bytes (default is 1M), or set to 0 for unlimited
.execute(); // send GET request
FileOutputStream out = new FileOutputStream(new File(filename));
out.write(r.bodyAsBytes());
out.close();
@ EJP评论更新:
FileUtils
class on GitHub。它会调用收到的openStream()
对象的URL
。openStream()
是openConnection().inputStream()
。openConnection()
返回URLConnection
个对象。如果URL
使用的协议有适当的子类,它将返回该子类的实例。在这种情况下,HttpsURLConnection
是HttpURLConnection
的子类。HttpURLConnection
在true
中定义,默认情况下确实为HttpsURLConnection
:设置此类是否应自动遵循HTTP重定向(响应代码为3xx的请求)。 默认为True。
Location
没有处理(正确)从HTTPS到HTTP的重定向。 - 这是@VGR提到的情况在下面的评论中。HttpsURLConnection
阅读HttpURLConnection
标题来手动处理重定向,然后在新的 public class Building {
private BuildingType buildingType; //House or Garage
private int floors;
private int windows;
enum BuildingType{
HOUSE,GARAGE
}
}
中使用它。 (followRedirects option)(如果Jsoup做同样的话我也不会感到惊讶。)