2017-09-10 9 views
0

からバイナリファイルをダウンロード:私はURLからファイルをダウンロードするには、このコードを使用していたURL

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

Iは、例えば使用してURLを作成し、 「https://mjcdn.cc/2/282676442/MjUgU2FhbCAtIFZlZXQgQmFsaml0Lm1wMw==」、 は、これはうまく動作し、mp3ですダウンロード。 ただし、別のURLを使用すると : 「https://dl.jatt.link/hd.jatt.link/a0339e7c772ed44a770a3fe29e3921a8/uttzv/Hummer-(Mr-Jatt.com).mp3」、 ファイルは0kbです。

これらのURLの両方からファイルをダウンロードすることはできますか? ここで何が間違っていて、どのように修正できますか?

答えて

1

私はあなたの2つのURLの違いに気づいた:

  • 最初のものは、単にファイルwithout redirectionをバック与えます。
  • しかし、第2のものresponds with a redirectHTTP/1.1 302 Moved Temporarily)。 HTTPSからHTTPプロトコルへのリダイレクトであるため、特別なケースです。

ブラウザはリダイレクトに従うことができますが、あなたのプログラムは何らかの理由で(以下を参照)できません。

HTTPクライアントライブラリ(例:Apache HTTP clientまたはJsoup)を使用し、リダイレクトに従うように設定することをお勧めします(デフォルトではそうしない場合)。

例えば、Jsoupで、あなたはこのようなコードが必要になりますが:@のEJPのコメント

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(); 

更新:

  • 私は、Apache CommonsのIOのFileUtils class on GitHubを見上げました。受信したURLオブジェクトのopenStream()を呼び出します。
  • openStream()は、openConnection().inputStream()の省略形です。
  • openConnection()は、URLConnectionオブジェクトを返します。 URLによって使用されるプロトコルに適切なサブクラスがある場合、そのサブクラスのインスタンスが返されます。この場合はHttpsURLConnectionであり、これはHttpURLConnectionのサブクラスです。
  • followRedirects optionHttpURLConnectionで定義され、それが実際にデフォルトでtrueですさ:HTTPリダイレクト(応答コード3xxの要求)に自動的にこのクラスが従うべきかどうか

を設定します。 デフォルトではTrueです。

  • のでOPのアプローチは、通常はあまりにもリダイレクトで動作しますが、HTTPSからHTTPへのリダイレクトがHttpsURLConnectionで(適切に)処理されないようです。 - @VGRは以下のコメントに記載されています。
  • LocationヘッダーをHttpsURLConnectionと読んで手動でリダイレクトを処理し、それを新しいHttpURLConnectionで使用することができます。
  • 私はJsoupが既にHTTPリダイレクションへのHTTPSを正しく処理する方法を実装していると同時に、役に立つ豊富な機能を提供しているので、私はJsoupを提案しました(これはJsoupが同じことをしても驚くことではありません)。
+2

'https' URLから' http' URLへのリダイレクトは安全でないと考えられているので、多くのライブラリはリダイレクトに従うように要求されてもそれに従わないことに注意してください。 – VGR

+0

あなたは確かに正しいとありがとうございます。 :)私はちょうど上記のURLでJsoupを試してきましたが、完璧に動作します。 :) – juzraai

+1

ありがとう...私はリダイレクトに従っていなかったからだと思った。リダイレクトに従い、Jsoupを使用してレスポンスをバイトとして消費する簡単な方法を教えていただきありがとうございます。偶然、私はすでにJsoupを私のアプリケーションの一部として使っています! – superstar

関連する問題