ホームページ > 記事 > PHPフレームワーク > ThinkPHP6 を使用して大きなファイルをアップロードおよびダウンロードするにはどうすればよいですか?
インターネット技術の継続的な発展に伴い、ファイルのアップロードとダウンロードは Web サイト開発プロセスにおいて不可欠な機能になりました。プログラムの効率と安定性は、大きなファイルのアップロードとダウンロードを処理する場合に特に重要になります。 ThinkPHP6 は、大きなファイルのアップロードおよびダウンロード機能を効果的に実装するのに役立つ強力な PHP フレームワークです。
1. 大きなファイルのアップロード
ThinkPHP6 を使用して大きなファイルをアップロードする場合は、次の点を考慮する必要があります:
次に、単純な大規模ファイルのアップロード コード例を示します。
//コントローラで大規模ファイルのアップロードのメソッドを定義します。
public function Upload()
{
$chunk = input('param.chunk'); // 获取当前上传的分片序号 $chunks = input('param.chunks'); // 获取分片总数 $file = request()->file('file'); // 获取上传的文件 $md5 = md5_file($file->getRealPath()); // 获取上传文件的MD5值 $fileName = $md5 . '_' . $chunk . '.part'; // 拼接分片文件名 $file->move('./uploads/', $fileName); // 保存分片文件到服务器 if ($chunk === $chunks - 1) { // 如果是最后一个分片文件 $filePath = './uploads/' . $md5 . '_' . time() . '.mp4'; // 拼接最终文件名 $fp = fopen($filePath, 'ab'); // 打开最终文件 for ($i = 0; $i < $chunks; $i++) { // 循环读取分片文件并写入到最终文件 $partFileName = './uploads/' . $md5 . '_' . $i . '.part'; // 获取分片文件名 $partFile = fopen($partFileName, 'rb'); fwrite($fp, fread($partFile, filesize($partFileName))); // 写入到最终文件 fclose($partFile); // 关闭分片文件 unlink($partFileName); // 删除分片文件 } fclose($fp); // 关闭最终文件 return '上传完成'; } else { return '上传中'; }
}
フロントエンド ページでは、JavaScript を使用してマルチパート アップロードを実装できます:
function UploadFile(file) {
const size = file.size; const chunkSize = 1024 * 1024; // 将文件分割成1M大小的分片 const chunkCount = Math.ceil(size / chunkSize); // 计算分片数量 let currentChunk = 0; while (currentChunk < chunkCount) { const start = currentChunk * chunkSize; const end = (currentChunk + 1) * chunkSize; const blobChunk = file.slice(start, end); // 获取当前分片的Blob对象 const formData = new FormData(); formData.append('chunk', currentChunk); formData.append('chunks', chunkCount); formData.append('file', blobChunk); const xhr = new XMLHttpRequest(); xhr.open('POST', '/upload', true); xhr.onload = function () { if (xhr.status !== 200) { console.error('文件上传失败'); return; } const responseText = xhr.responseText; console.log(responseText); if (responseText === '上传完成') { console.log('文件上传成功'); } else { console.log('正在上传...'); } }; xhr.send(formData); currentChunk++; }
}
2. 大きなファイルのダウンロード
大きなファイルのダウンロードを扱うときは、次の点を考慮する必要があります:
次は、大きなファイルのダウンロードを実装するコード例です:
// コントローラーで大きなファイルのダウンロード メソッドを定義します
public function download()
{
$filePath = './videos/big.mp4'; // 要下载的文件路径 $fileSize = filesize($filePath); // 获取文件大小 header('Content-Disposition: attachment; filename="big.mp4"'); // 设置文件下载名字 header('Content-Type: video/mp4'); // 设置文件类型 header('Content-Length: ' . $fileSize); // 设置文件大小 if (isset($_SERVER['HTTP_RANGE'])) { // 如果设置了HTTP_RANGE,说明是断点续传请求 header('HTTP/1.1 206 Partial Content'); list($start, $end) = explode('-', $_SERVER['HTTP_RANGE']); // 获取已经下载的起始位置和结束位置 $start = max(0, intval($start)); $end = min($fileSize - 1, intval($end)); header('Content-Range: bytes ' . $start . '-' . $end . '/' . $fileSize); $length = $end - $start + 1; } else { // 否则是首次请求 $start = 0; $end = $fileSize - 1; $length = $fileSize; } header('Accept-Ranges: bytes'); $fp = fopen($filePath, 'rb'); fseek($fp, $start); while (!feof($fp) && !connection_aborted() && $start <= $end) { set_time_limit(0); $buffer = fread($fp, min(1024 * 1024, $length)); // 分段读取文件内容 echo $buffer; $start += strlen($buffer); $length -= strlen($buffer); flush(); // 清除输出缓存 } fclose($fp);
}
フロントエンド ページでは、JavaScript を使用して大きなファイルをダウンロードできます。
function downloadFile(url) {
const request = new XMLHttpRequest(); request.open('GET', url, true); request.onprogress = function (evt) { const progress = (evt.loaded / evt.total) * 100; console.log(`下载进度: ${progress.toFixed(2)}%`); }; request.send();
}
つまり、ThinkPHP6 を使用すると、大きなファイルのアップロードおよびダウンロード機能をより簡単に実装できるようになり、Web サイト ユーザーが大きなファイルを迅速かつ簡単に共有および転送できるようになります。
以上がThinkPHP6 を使用して大きなファイルをアップロードおよびダウンロードするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。