大きなファイルのアップロードを処理するとき、チャンクアップアップロードは、ファイル全体が完全にアップロードされるのを待つことなく、1つずつアップロードするための小さなチャンクにファイルを分割できる一般的な手法です。同時に、アップロードされたファイルが送信プロセス中に改ざんされないようにするために、通常、ハッシュアルゴリズムを使用してファイルの整合性を検証します。 PHPはhash_update_stream関数を提供します。これは、セグメント化されたハッシュアップロードの実装に役立ちます。この記事では、 HASH_UPDATE_STREAM関数を使用してこの関数を実装する方法を詳細に紹介します。
hash_update_stream関数は、phpのハッシュ関数であり、ストリーム(ファイル、データストリームなど)をハッシュするために使用されます。セグメント化されたアップロードシナリオでは、ファイルブロックがアップロードされるたびに、この関数を呼び出してハッシュ値を更新し、各ファイルブロックがハッシュを正しく計算し、整合性検証を実行できるようにすることができます。
関数プロトタイプ:
bool hash_update_stream ( resource $context , resource $handle [, int $length = 8192 ] )
$コンテキスト:通常はhash_init関数を介して作成されたハッシュコンテキストを指定します。
$ハンドル:オープンファイルまたはデータストリームを指すリソース。
$ length :読み取りバイト数、デフォルトは8192バイトです。
セグメントにアップロードする必要がある大きなファイルがあり、アップロードされた各ファイルブロックにはハッシュ検証が必要であるとします。次のように、セグメント化されたハッシュアップロードを実装できます。
最初に、ハッシュコンテキストを作成し、計算のためにハッシュアルゴリズム( SHA256など)を選択します。
$hashContext = hash_init('sha256');
次に、ファイルストリームを開き、ファイルの内容をセグメントにアップロードします。ファイルブロックがアップロードされるたびに、 hash_update_stream関数を呼び出してハッシュ値を更新します。
$filePath = 'path/to/largefile.zip'; // ファイルパス
$chunkSize = 8192; // 読み取りごとのブロックサイズ
$fileHandle = fopen($filePath, 'rb'); // ファイルストリームを開きます
if (!$fileHandle) {
die('ファイルを開くことができません');
}
while (!feof($fileHandle)) {
// ファイルストリームからブロックを読み取ります
$chunk = fread($fileHandle, $chunkSize);
// ハッシュ値を更新します
hash_update_stream($hashContext, $chunk);
// ここにファイルブロックをアップロードします
// 各ブロックをアップロードするためのアップロード機能があるとします
// upload_chunk($chunk);
}
// ファイルストリームを閉じます
fclose($fileHandle);
ファイルのすべてのブロックがアップロードされ、処理された後、 hash_final関数を使用して最終的なハッシュ値を取得できます。
$finalHash = hash_final($hashContext);
echo "ファイルのハッシュ値はです:$finalHash";
これにより、各ファイルブロックが正しくハッシュされていることを確認し、ファイル全体のハッシュ値を取得できます。
セグメント化されたアップロードプロセス中、クライアントがファイルブロックをアップロードするたびに、対応するハッシュ値(またはファイル全体のハッシュ値)をサーバーに送信でき、サーバーは受信したハッシュ値を介してファイルの整合性を検証できます。
サーバー側の検証プロセスは次のとおりです。
// クライアントによってアップロードされたハッシュ値が受信されたと仮定します
$receivedHash = $_POST['file_hash'];
// サーバー側のハッシュを再計算します
$serverHashContext = hash_init('sha256');
$fileHandle = fopen('path/to/uploaded_chunk', 'rb'); // アップロードされたファイルブロックを開きます
while (!feof($fileHandle)) {
$chunk = fread($fileHandle, 8192);
hash_update_stream($serverHashContext, $chunk);
}
$calculatedHash = hash_final($serverHashContext);
// ハッシュ値を確認してください
if ($calculatedHash === $receivedHash) {
echo 'ファイルブロックハッシュ検証が渡されました';
} else {
echo 'ファイルブロックハッシュ検証に失敗しました';
}
fclose($fileHandle);
hash_update_stream関数を使用してセグメント化されたハッシュアップロードを実装することは、アップロードプロセス中に各ファイルブロックの整合性を確保できるシンプルで効果的な方法です。上記の手順を通じて、ファイルをセグメントにアップロードし、ハッシュ値の検証を使用して、アップロードされたデータが改ざんされていないことを確認できます。アップロードプロセス中に、ファイルの各ブロックを正しい順序でアップロードできるようにするために、サーバーは対応するハッシュ検証を実行する必要があることに注意してください。
上記は、hash_update_stream関数を使用してセグメント化されたハッシュアップロードを実装する基本的な方法です。この記事があなたに役立つことを願っています!