ファイルシャードは、大きなファイルをアップロードする機能を実装する際に非常に一般的な手法です。超大型ファイルを複数の小さなフラグメントに分割し、1つずつアップロードしてアップロード効率と成功率を改善し、ネットワーク中断後にブレークポイントの連続伝送を実現できます。
PHPでは、 ceil()関数は、シャードアップロードの計算において重要な役割を果たします。この記事では、ceil()を使用して、ファイルをアップロードするために必要なシャードの数を計算する方法を詳細に説明します。
ceil()は、PHPに組み込まれた数学的関数であり、数字を切り上げるために使用されます。言い換えれば、小数点がいくらであっても、彼らはそれをそれよりも大きい最小の整数に運びます。
echo ceil(2.1); // 出力 3
echo ceil(5.9); // 出力 6
$ filesizeバイトのサイズのファイルをスライスあたり$ chunksizeバイトの小さな部分にアップロードしたいと想像してください。シャードの総数は、次の式で計算できます。
破片数 = 上に丸くします ( ファイルサイズ / 破片のサイズ )
これはまさにCEIL()関数の目的です。
以下は、ファイルアップロードの数を次のものに計算するための単純なPHPコードスニペットです。
<?php
$fileSize = 10485760; // ファイルサイズ为 10MB(ユニット:バイト)
$chunkSize = 1048576; // 各ピース 1MB
$totalChunks = ceil($fileSize / $chunkSize);
echo "アップロードするシャードの総数はです: $totalChunks";
?>
出力は次のとおりです。
アップロードするシャードの総数はです: 10
つまり、10MBのファイル、1ピースあたり1MB、正確に10個のシャードが必要です。
フロントエンドは、JavaScriptを介してセットのシャードサイズに従ってファイルを分割します。 1つのシャードがアップロードされるたびに、通常、次のパラメーターが付属しています。
現在のシャードのインデックス(チャンク1、チャンク2など)
各ピースのサイズ
ファイル一意の識別子( MD5またはUUIDの使用など)
バックエンド(PHPを使用)は各シャードを受け取り、すべてのシャードがアップロードされるまで一時的に保存し、これらのシャードを完全なファイルにマージします。
<?php
$index = $_POST['chunkIndex']; // 現在のシャードインデックス
$total = $_POST['totalChunks']; // 破片の総数
$fileId = $_POST['fileId']; // ファイル一意の識別子
$chunk = $_FILES['file']['tmp_name'];
$chunkDir = __DIR__ . "/chunks/$fileId";
if (!is_dir($chunkDir)) {
mkdir($chunkDir, 0777, true);
}
move_uploaded_file($chunk, "$chunkDir/chunk_$index");
if ($index == $total - 1) {
// すべてのシャードがアップロードされています,マージを開始します
$finalFile = fopen(__DIR__ . "/uploads/$fileId", 'ab');
for ($i = 0; $i < $total; $i++) {
$chunkPath = "$chunkDir/chunk_$i";
fwrite($finalFile, file_get_contents($chunkPath));
}
fclose($finalFile);
// 一時的な破片を削除します
array_map('unlink', glob("$chunkDir/*"));
rmdir($chunkDir);
echo "ファイルアップロードとマージに正常にマージします!";
}
?>
実際の展開では、 https://upload.m66.netなどの独立したサービスドメイン名にアップロードインターフェイスを展開することができ、それによりアップロード速度が向上し、メインサイトリソースが大量に占有されていることを回避できます。
フロントエンドのアップロードリクエスト例:
fetch('https://upload.m66.net/upload.php', {
method: 'POST',
body: formData
});
バックエンドPHPインターフェイスは、シェード情報に基づいてceil()を呼び出して、アップロードが完了しているかどうかを確認できます。
$expectedChunks = ceil($fileSize / $chunkSize);
if ($uploadedChunks == $expectedChunks) {
// ファイルをマージします
}
CEIL()関数を使用すると、シャードアップロードのシャード数をカウントする問題を簡単に処理できます。 PHPの組み込み関数とファイル操作機能を合理的に利用することにより、大きなファイルのシャードのアップロードとマージを効率的かつ堅牢に完了することができます。ファイルストレージシステムを構築している場合でも、ユーザーによりフレンドリーなアップロードエクスペリエンスを提供している場合でも、このテクニックを習得することが非常に必要です。