>PHP 프레임워크 >ThinkPHP >ThinkPHP6를 사용하여 대용량 파일을 업로드하고 다운로드하는 방법은 무엇입니까?

ThinkPHP6를 사용하여 대용량 파일을 업로드하고 다운로드하는 방법은 무엇입니까?

PHPz
PHPz원래의
2023-06-12 09:46:083088검색

인터넷 기술의 지속적인 발전으로 인해 파일 업로드 및 다운로드는 웹사이트 개발 과정에서 필수적인 기능이 되었습니다. 대용량 파일 업로드 및 다운로드를 처리할 때 프로그램의 효율성과 안정성이 특히 중요합니다. ThinkPHP6은 대용량 파일 업로드 및 다운로드 기능을 효과적으로 구현하는 데 도움이 되는 강력한 PHP 프레임워크입니다.

1. 대용량 파일 업로드

ThinkPHP6을 사용하여 대용량 파일을 업로드하는 경우 다음 측면을 고려해야 합니다.

  1. 프런트 엔드에서 조각난 업로드 기술, 즉 파일을 여러 개의 작은 파일로 분할해야 합니다. 업로드용. 이렇게 하면 대용량 파일을 업로드할 때 네트워크 중단과 같은 문제를 효과적으로 방지할 수 있습니다.
  2. 백엔드에서 샤드 병합 기술, 즉 부분적으로 업로드된 작은 파일을 완전한 대용량 파일로 병합하는 기술을 사용해야 합니다. 이는 PHP의 파일 작업 기능을 사용하여 수행해야 합니다.

다음은 간단한 대용량 파일 업로드 코드 예입니다.

//컨트롤러에서 대용량 파일 업로드 방법 정의

공용 함수 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. 대용량 파일 다운로드

대용량 파일 다운로드를 처리할 때 다음 측면을 고려해야 합니다.

  1. Things 파일을 다운로드할 때 고려해야 할 사항 파일 크기, 파일이 큰 경우 분할 다운로드 기술을 사용해야 합니다. 즉, 파일 내용을 세그먼트 단위로 읽어 클라이언트에 전송합니다. 이렇게 하면 메모리 손상 문제를 효과적으로 방지할 수 있습니다.
  2. 중단점 재개 기능을 구현하려면 클라이언트가 다운로드한 파일 크기를 기록해야 합니다. 서버에서 파일 내용을 읽을 때 읽기 시작 위치와 길이를 지정해야 합니다.

다음은 대용량 파일 다운로드를 구현하는 코드 예제입니다.

// 컨트롤러에서 대용량 파일 다운로드 방법 정의

public 함수 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를 사용하면 대용량 파일 업로드 및 다운로드 기능을 더 쉽게 구현할 수 있어 웹사이트 사용자가 대용량 파일을 공유하고 전송할 수 있습니다. 파일을 빠르고 쉽게.

위 내용은 ThinkPHP6를 사용하여 대용량 파일을 업로드하고 다운로드하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.