3

How to download and save a file from Internet using Java? からこの素晴らしいスニペットを使用しています。URL からファイルをダウンロードするには:

URL website = new URL("http://www.website.com/information.asp");
ReadableByteChannel rbc = Channels.newChannel(website.openStream());
FileOutputStream fos = new FileOutputStream("information.html");
fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE);

しかし、代わりにLong.MAX_VALUE、セキュリティ上の理由からダウンロードを2MBに制限することを好むので、

fos.getChannel().transferFrom(rbc, 0, 2097152);

しかし、ファイル サイズが 2 MB を超える場合、どのように処理すればよいのでしょうか。

ファイルが破損しているかどうかを確認するにはどうすればよいですか?

4

2 に答える 2

5

RFCに従って Content-Length ヘッダーを確認することを検討しましたか? 次に、これが許容値 (この場合は 2MB) を超えているかどうかを確認し、それ以上の処理を拒否できます。これは、最初の HTTPHEAD要求を使用しGETて、満足している場合は を実行するか、またはGET応答のヘッダーのみを読み取り、許容できる場合はさらにストリーミングを続行することで実現できます。

別の方法として (確かに見苦しいですが)、BufferedReader2MB のバッファーを渡し、それをヘッダーと比較することもできます。

破損に関しては、他のコメントで述べられているように、チェックサムを使用することをお勧めします。もちろん、これにはリソースのチェックサムを事前に知っておく必要があり、HTTP 応答自体から得られる可能性が高いものではありません。

于 2013-09-17T07:03:42.827 に答える
1

この質問には、実際には 2 つの側面があります。

  • ファイル全体をダウンロードしたかどうかを確認する方法

  • ダウンロードしたものが破損しているかどうかをどのように知ることができますか。

最初に注意すべきことは、ファイル転送を 2Mb で「切り刻む」場合、転送されたファイルの見かけのサイズが 2Mb である場合、完全ではないことを確信できるということです。(見た目では、現在のコードは、転送エンコーディングがデコードされた後のバイトを提供します...これにより、物事が簡素化されます。)

次に注意すべきことは、HTTP 応答には、Content-length多くの場合、応答本文で期待される (転送エンコードされた) コンテンツのバイト数をクライアントに通知するヘッダーが含まれることです。ただし、(デコード後に) 実際に受信したバイトが実際に正しいかどうかはわかりません。(さらに、このヘッダーはオプションです...そこにあることに依存することはできません。)

@ato が指摘しているように、実際にデータを読み取ろうとする前に、GET (または HEAD) 応答で Content-length を確認することをお勧めします。

ただし、完全な/破損していないファイルを持っているかどうかを知る唯一の確実な方法は、転送とは別に取得したチェックサムまたは (理想的には) 暗号ハッシュと照合することです。HTTP プロトコルを使用してチェックサムまたはハッシュを取得する標準的な方法はありません。

于 2013-09-17T07:12:48.233 に答える