Rumah >rangka kerja php >ThinkPHP >Bagaimana untuk menggunakan ThinkPHP6 untuk memuat naik dan memuat turun fail besar?

Bagaimana untuk menggunakan ThinkPHP6 untuk memuat naik dan memuat turun fail besar?

PHPz
PHPzasal
2023-06-12 09:46:083089semak imbas

Dengan perkembangan teknologi Internet yang berterusan, muat naik dan muat turun fail telah menjadi fungsi yang sangat diperlukan dalam proses pembangunan laman web. Kecekapan dan kestabilan program menjadi sangat penting apabila mengendalikan muat naik dan muat turun fail yang besar. ThinkPHP6 ialah rangka kerja PHP yang berkuasa yang boleh membantu kami melaksanakan fungsi muat naik dan muat turun fail besar dengan berkesan.

1. Muat naik fail besar

Apabila menggunakan ThinkPHP6 untuk memuat naik fail besar, anda perlu mempertimbangkan aspek berikut:

  1. Anda perlu menggunakan muat naik berpecah pada Teknologi bahagian hadapan, iaitu, membahagikan fail kepada beberapa fail kecil untuk dimuat naik. Ini boleh mengelakkan masalah seperti gangguan rangkaian apabila memuat naik fail besar dengan berkesan.
  2. Teknologi cantuman Shard perlu digunakan pada bahagian belakang, iaitu fail kecil yang dimuat naik dalam bahagian digabungkan menjadi fail besar yang lengkap. Ini perlu dicapai menggunakan fungsi operasi fail PHP.

Berikut ialah contoh kod muat naik fail besar yang ringkas:

//Tentukan kaedah muat naik fail besar dalam pengawal

muat naik fungsi awam()
{

$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 '上传中';
}

}

Pada halaman hadapan, anda boleh menggunakan JavaScript untuk melaksanakan muat naik berbilang bahagian:

fungsi muat naikFail(fail) {

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. Muat turun fail yang besar

Apabila berurusan dengan muat turun fail yang besar, kita perlu mempertimbangkan aspek berikut:

  1. Saiz fail perlu diambil menjadi pertimbangan semasa memuat turun fail Jika Jika fail besar, teknologi muat turun bersegmen perlu digunakan, iaitu kandungan fail dibaca dalam segmen dan dihantar kepada klien. Ini boleh mengelakkan masalah kerosakan ingatan dengan berkesan.
  2. Jika anda ingin melaksanakan fungsi resume titik putus, anda perlu merekodkan saiz fail yang telah dimuat turun oleh klien Semasa membaca kandungan fail pada pelayan, anda perlu menentukan kedudukan permulaan dan panjang bacaan.

Berikut ialah contoh kod untuk melaksanakan muat turun fail besar:

// Tentukan kaedah muat turun fail besar dalam pengawal

muat turun fungsi awam()
{

$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);

}

Pada halaman hujung hadapan, anda boleh menggunakan JavaScript untuk memuat turun fail besar:

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();

}

Ringkasnya, menggunakan ThinkPHP6, kami boleh melaksanakan fungsi muat naik dan muat turun fail besar dengan lebih mudah, membolehkan pengguna tapak web berkongsi dan memindahkan fail besar dengan cepat dan mudah.

Atas ialah kandungan terperinci Bagaimana untuk menggunakan ThinkPHP6 untuk memuat naik dan memuat turun fail besar?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn