簡體   English   中英

從網址下載二進制文件

[英]Downloading binary file from url

我正在使用此代碼從URL下載文件:

FileUtils.copyURLToFile(url, new File("C:/Songs/newsong.mp3"));

例如,當我使用“ https://mjcdn.cc/2/282676442/MjUgU2FhbCAtIFZlZXQgQmFsaml0Lm1wMw== ”創建網址時,此方法就可以正常工作並且可以下載mp3。 但是,如果我使用另一個URL:“ https://dl.jatt.link/hd.jatt.link/a0339e7c772ed44a770a3fe29e3921a8/uttzv/Hummer-(Mr-Jatt.com).mp3 ”,則文件為0kb。

我可以從Web瀏覽器中的這兩個URL下載文件。 這是怎么了,我該如何解決。

我注意到您的2個網址之間存在差異:

  • 第一個只是不帶重定向就返回文件。
  • 但是第二個響應使用重定向HTTP/1.1 302 Moved Temporarily )。 這也是一種特殊情況,因為它是從HTTPS到HTTP協議的重定向。

瀏覽器可以遵循重定向,但是由於某種原因(請參閱下文),您的程序不能。

我建議您使用HTTP客戶端庫(例如Apache HTTP客戶端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評論的更新:

  • 在GitHub上查找了Apache Commons IO的FileUtils 它調用接收到的URL對象的openStream()
  • openStream()openConnection().inputStream()的簡寫。
  • openConnection()返回一個URLConnection對象。 如果存在URL使用的協議的適當子類,它將返回該子類的實例。 在這種情況下,這是HttpsURLConnection ,它是HttpURLConnection的子類。
  • followRedirects選項是在HttpURLConnection定義的,默認情況下確實為true

設置此類是否應自動遵循HTTP重定向(響應代碼為3xx的請求)。 默認為True。

  • 因此, OP的方法通常也適用於重定向,但是HttpsURLConnection似乎並沒有正確地處理從HTTPS到HTTP的重定向。 -在以下評論中提到的@VGR就是這種情況。
  • 通過使用HttpsURLConnection讀取Location標頭,然后在新的HttpURLConnection使用它,可以手動處理重定向。 示例 )(如果Jsoup這樣做也不會感到驚訝。)
  • 我建議使用Jsoup,因為它已經實現了一種正確處理HTTPS到HTTP重定向的方法,並且還提供了大量有用的功能。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM