1

私のサーブレットは、FileInputStream.read() を使用してバイナリ ファイルから読み取ります。ファイルの終わりに達した場合、これは -1 を返します。次に、ファイルのバイトを応答ストリームを介してクライアントに送信します。

次に、応答ストリームを介してファイルの md5 ハッシュのバイトを送信したいと考えています。クライアントがどのバイトがどれであるかを知るために、ファイルの末尾をファイルの md5 から分割するにはどうすればよいですか? ストリームが機能しなくなるため、-1 バイトを送信できません。

実際のファイル内にある可能性がないことがわかっているファイルの終わりを知らせるために送信できる他のバイトはありますか?実際にファイルが終了する前にファイルの終わりを知らせることはできませんか?

4

3 に答える 3

2

ファイルが変更されないことを信頼できると仮定すると、ファイルを1回読み取り、MD5ハッシュを計算し、それをヘッダーとして設定してから、ファイルを完全な本文として書き出します。これは、ボディを2つの部分に分割するよりも、クライアントにとって扱いやすいと思われます。

ファイルが十分に小さい場合は、ByteArrayOutputStream読み取り/ハッシュ時にファイルを書き込み、2回読み取る必要がないようにすることができますが、ファイルが大きい場合は、おそらくそのメモリヒットを取得したくないでしょう。

もう1つのオプションは、ハッシュをファイルシステムに保存することです。最初にファイルを書き込んでいるものはすべて、ハッシュの責任を負います。そうすれば、ハッシュする必要があるのは1回だけです。必要に応じて、ハッシュを検証するために読むときにいつでもハッシュすることができます。

于 2011-04-10T20:07:27.037 に答える
1

他の答えは良いです-私はあなたに別の視点を与えるためにこれに言及するだけです. MD5 ハッシュをサーブレット名前空間内の別のリソースにすることができます。

たとえば、クライアントはファイルをダウンロードするために「path/download-file」を要求し、md5 を取得するために「path/download-file.md5」を要求します。MD5 を計算するコードは、ファイルのダウンロード中にこれを実行し、ファイル システムに書き込むか、ハッシュをキャッシュに保存します (おそらく永続的です)。

基本的な形式では、これはクライアントが md5 の前にファイルをダウンロードすることを前提としています。これが事実であることを確認するためにチェックを入れることができます。別の方法として、必要に応じて md5 を計算することもできますが、クライアントがファイルの前に md5 を要求すると、回避したい二重読み取りの非効率性が発生します。ファイルのダウンロード後に md5 を要求することを義務付けることで、これを回避できます。

于 2011-04-10T20:21:04.817 に答える
0

MD5ハッシュは既知の長さであるため、最初に送信します。

于 2011-04-10T20:06:52.263 に答える