ファイルの転送またはダウンロード、特に大きなファイル中に、中断が発生することがよくあります。ファイルの整合性を確保するために、ファイルは通常、ファイル転送中にハッシュされ、検証されます。 PHPは強力なハッシュ関数を提供し、 Hash_update_stream関数はその1つです。特にブレークポイントの連続ファイルの検証に適した、大きなファイルのハッシュ計算を処理するために使用できます。
この記事では、 hash_update_streamを使用してファイルのハッシュインテグリティ検証を実装する方法を紹介し、中断後もダウンロードし続けるときにファイルが整合性検証であることを確認します。
hash_update_stream関数は、ストリームデータを読み取るプロセス中にハッシュ値を計算するPHPの関数です。 Hash_updateとは異なり、後者は一度にデータ全体をメモリにロードする必要がありますが、 Hash_update_streamはハッシュ計算のためにファイルストリームを徐々に読み取ることができるため、チャンクで処理する必要がある大きなファイルまたはファイルに特に適しています。
bool hash_update_stream ( resource $context , resource $stream [, int $length ] )
$コンテキスト:ハッシュリソース、通常はhash_initによって作成されます。
$ Stream : Fopen()を介して取得されるファイルストリームリソース。
$の長さ:読み取るバイト数、デフォルトは8192バイトです。
ファイル転送中、送信が中間に切断されている場合、ブレークポイント転送メカニズムは切断された位置から引き続きダウンロードされます。ブレークポイントが継続的に送信された後にファイルの整合性を確認するために、ファイルのハッシュ値は通常サーバー側で計算され、クライアントが送信したハッシュ値と比較します。
ファイルBigfile.zipのダウンロードを継続するブレークポイントがあるとしたら、送信プロセス中にファイルが改ざんまたは一部のコンテンツを失っていることを確認する必要があります。以下は、ハッシュ整合性の検証を実装する手順です。
ファイルbigfile.zipをダウンロードし、ブレークポイントに転送されているときにファイルの整合性を確認する必要があるとします。次のコードは、ブレークポイントの継続中にhash_update_stream関数を使用してファイルのハッシュを計算する方法を示しています。
<?php
// 初期ハッシュコンテキスト(使用 SHA256 アルゴリズム)
$hashContext = hash_init('sha256');
// ファイルストリームを開きます
$fileStream = fopen('https://m66.net/bigfile.zip', 'rb');
if (!$fileStream) {
die("ファイルを開くことができません!\n");
}
// ファイルのハッシュ値を計算します
while (!feof($fileStream)) {
// ファイルを読み、ハッシュを更新します
$data = fread($fileStream, 8192);
hash_update_stream($hashContext, $data);
}
// 最終的なハッシュ値を取得します
$fileHash = hash_final($hashContext);
// 出力ファイルのハッシュ値
echo "提出SHA-256ハッシュ値:$fileHash\n";
// ファイルストリームを閉じます
fclose($fileStream);
// 假设已经在服务器端生成并存储了提出正确ハッシュ値
$serverStoredHash = 'abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890';
// 比较本地计算的ハッシュ値与服务器存储的ハッシュ値
if ($fileHash === $serverStoredHash) {
echo "ファイルの整合性の確認が成功しました!\n";
} else {
echo "ファイル検証に失敗しました,ファイルが破損または改ざんされている可能性があります!\n";
}
?>
HASH_INIT :ハッシュコンテキストを初期化し、 SHA256アルゴリズムを選択してハッシュ値を生成します。
FOPEN :ダウンロードするファイルストリームを開きます。ここでは、 https://m66.net/bigfile.zipをサンプルファイルアドレスとして使用します。
hash_update_stream :ファイル内の各データを徐々に読み取り、ハッシュ値を更新します。時間ごとに読み取られるデータブロックサイズは8192バイトです。
hash_final :ファイルの最終的なハッシュ値を取得します。
ファイルの確認:計算されたハッシュ値とサーバーに保存された正しいハッシュ値との比較ファイルの整合性を確認します。
ブレークポイントが継続するシナリオでは、通常、「ダウンロードされたパーツ」ハッシュ値を保存し、ダウンロードを続けているときに最後のブレークポイントから始まるファイルパーツのハッシュを計算します。これを行うには、 FSEEKでFREADを使用してファイルの読み取り位置を制御できるため、指定された位置から計算が開始されるようにします。
// 指定された場所にファイルフローポインターを設定します(たとえば、ブレークポイントが継続される部分)
fseek($fileStream, $resumePosition);
ダウンロードを続けている間、再開の場所からデータブロックを読み取り、ハッシュを更新し、最終的にファイル全体の整合性を確認します。
hash_update_streamを使用することにより、PHPは、特にブレークポイントの連続伝送でファイルを転送する場合、大きなファイルのハッシュ値を計算する効率的な方法を提供します。このようにして、転送プロセス中にファイルの整合性と正確性を確保し、ファイルが中央で切断された後にデータの損失または破損を回避できます。
Breakpointの連続伝送をサポートする必要があるファイルダウンロードまたはアップロードシステムを開発している場合、 Hash_update_stream関数とHash検証を組み合わせて、信頼できるデータ整合性保証が提供されます。