php怎麼實現下載斷點續傳

2022-11-06 10:00:25

php實現下載斷點續傳的方法:1、建立一個php範例檔案;2、定義一個download方法;3、通過「if (empty($file) or !is_file($file)) {...}」方法檢查檔案是否存在;4、通過「if (!empty($_SERVER['HTTP_RANGE'])) {...}」實現檔案下載,並支援斷點續傳即可。

php入門到就業線上直播課:進入學習
Apipost = Postman + Swagger + Mock + Jmeter 超好用的API偵錯工具:

本教學操作環境:windows7系統、PHP8.1版、Dell G3電腦。

php怎麼實現下載斷點續傳?

PHP實現檔案下載,支援斷點續傳

我一般廢話比較少,直接甩程式碼,不懂扣我,再不懂就只能扣腳丫了,OK?

PHP實現檔案下載介面,支援斷點續傳,下載器可以檢視檔案大小。檔案分片傳輸,記憶體消耗低。注意:使用時建議增加安全路徑限制及可下載檔案型別限制

/**
 * 檔案下載
 * @param string $file 檔案絕對路徑
 */
function download($file)
{
    str_replace(['/','\\'], DIRECTORY_SEPARATOR, $file);
    //檢查檔案是否存在
    if (empty($file) or !is_file($file)) {
        die('檔案不存在');
    }
    $fileName = basename($file);
    //以唯讀和二進位制模式開啟檔案
    $fp = @fopen($file, 'rb');
    if ($fp) {
        // 獲取檔案大小
        $file_size = filesize($file);
        //告訴瀏覽器這是一個檔案流格式的檔案
        header('content-type:application/octet-stream');
        header('Content-Disposition: attachment; filename=' . $fileName);
        // 斷點續傳
        $range = null;
        if (!empty($_SERVER['HTTP_RANGE'])) {
            $range = $_SERVER['HTTP_RANGE'];
            $range = preg_replace('/[\s|,].*/', '', $range);
            $range = explode('-', substr($range, 6));
            if (count($range) < 2) {
                $range[1] = $file_size;
            }
            $range = array_combine(array('start', 'end'), $range);
            if (empty($range['start'])) {
                $range['start'] = 0;
            }
            if (empty($range['end'])) {
                $range['end'] = $file_size;
            }
        }
        // 使用續傳
        if ($range != null) {
            header('HTTP/1.1 206 Partial Content');
            header('Accept-Ranges:bytes');
            // 計算剩餘長度
            header(sprintf('content-length:%u', $range['end'] - $range['start']));
            header(sprintf('content-range:bytes %s-%s/%s', $range['start'], $range['end'], $file_size));
            // fp指標跳到斷點位置
            fseek($fp, sprintf('%u', $range['start']));
        } else {
            header('HTTP/1.1 200 OK');
            header('Accept-Ranges:bytes');
            header('content-length:' . $file_size);
        }
        while (!feof($fp)) {
            echo fread($fp, 4096);
            ob_flush();
        }
        fclose($fp);
    } else {
        die('File loading failed');
    }
}
登入後複製

推薦學習:《》

以上就是php怎麼實現下載斷點續傳的詳細內容,更多請關注TW511.COM其它相關文章!