从网址

时间:2017-09-10 22:04:27

标签: java file url download

我正在使用此代码从网址下载文件:

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。

我可以从网络浏览器中下载这两个网址中的文件。 这里有什么问题,我该如何解决呢。

1 个答案:

答案 0 :(得分:1)

我注意到您的2个网址之间存在差异:

浏览器可以遵循重定向,但是您的程序 - 出于某种原因(见下文) - 不能。

我建议您使用HTTP客户端库(例如Apache HTTP clientJsoup),并将其配置为遵循重定向(如果他们默认情况下不这样做)。

例如,使用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评论更新:

  • 我查了一下Apache Commons IO的FileUtils class on GitHub。它会调用收到的openStream()对象的URL
  • openStream()openConnection().inputStream()
  • 的简写
  • openConnection()返回URLConnection个对象。如果URL使用的协议有适当的子类,它将返回该子类的实例。在这种情况下,HttpsURLConnectionHttpURLConnection的子类。
  • HttpURLConnectiontrue中定义,默认情况下确实为HttpsURLConnection
  

设置此类是否应自动遵循HTTP重定向(响应代码为3xx的请求)。 默认为True。

  • 所以 OP的方法通常也适用于重定向,但似乎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做同样的话我也不会感到惊讶。)
  • 我建议使用Jsoup,因为它已经实现了正确处理HTTPS到HTTP重定向的方法,并且还提供了大量有用的功能。