Heim  >  Artikel  >  PHP-Framework  >  Wie verwende ich ThinkPHP6 zum Hoch- und Herunterladen großer Dateien?

Wie verwende ich ThinkPHP6 zum Hoch- und Herunterladen großer Dateien?

PHPz
PHPzOriginal
2023-06-12 09:46:083041Durchsuche

Mit der kontinuierlichen Weiterentwicklung der Internettechnologie sind das Hochladen und Herunterladen von Dateien zu unverzichtbaren Funktionen im Website-Entwicklungsprozess geworden. Die Effizienz und Stabilität des Programms sind besonders wichtig, wenn große Datei-Uploads und -Downloads verarbeitet werden. ThinkPHP6 ist ein leistungsstarkes PHP-Framework, das uns dabei helfen kann, Funktionen zum Hoch- und Herunterladen großer Dateien effektiv zu implementieren.

1. Hochladen großer Dateien

Wenn Sie ThinkPHP6 zum Hochladen großer Dateien verwenden, müssen Sie die folgenden Aspekte berücksichtigen:

  1. Sie müssen die fragmentierte Upload-Technologie am Frontend verwenden, dh die Datei in mehrere kleine Dateien aufteilen zum Hochladen. Dadurch können Probleme wie Netzwerkunterbrechungen beim Hochladen großer Dateien effektiv vermieden werden.
  2. Im Backend müssen Sie die Shard-Merging-Technologie verwenden, d. h. kleine, in Teilen hochgeladene Dateien zu einer kompletten großen Datei zusammenführen. Dies muss mithilfe der Dateioperationsfunktionen von PHP erreicht werden.

Das Folgende ist ein einfaches Codebeispiel für das Hochladen großer Dateien:

// Definieren Sie die Methode zum Hochladen großer Dateien im Controller

öffentliche Funktion 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 '上传中';
}

}

Auf der Startseite: Sie können JavaScript verwenden. Implementieren Sie einen mehrteiligen Upload:

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. Download großer Dateien

Beim Herunterladen großer Dateien müssen wir die folgenden Aspekte berücksichtigen:

  1. Dinge Beim Herunterladen von Dateien ist die Dateigröße zu berücksichtigen. Wenn die Datei groß ist, muss die segmentierte Download-Technologie verwendet werden, dh der Dateiinhalt wird in Segmenten gelesen und an den Client gesendet. Dadurch können Speicherbeschädigungsprobleme wirksam vermieden werden.
  2. Wenn Sie die Breakpoint-Resume-Funktion implementieren möchten, müssen Sie die Dateigröße aufzeichnen, die der Client heruntergeladen hat. Beim Lesen des Dateiinhalts auf dem Server müssen Sie die Lesestartposition und -länge angeben.

Das Folgende ist ein Codebeispiel zum Implementieren des Herunterladens großer Dateien:

// Definieren Sie die Methode zum Herunterladen großer Dateien im Controller.

öffentliche Funktion 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);

}

Auf der Startseite: Es kann mit JavaScript implementiert werden. Download großer Dateien:

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

}

Kurz gesagt, mit ThinkPHP6 können wir Funktionen zum Hochladen und Herunterladen großer Dateien einfacher implementieren, sodass Website-Benutzer große Dateien teilen und übertragen können Dateien schnell und einfach.

Das obige ist der detaillierte Inhalt vonWie verwende ich ThinkPHP6 zum Hoch- und Herunterladen großer Dateien?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn