首页 > php上传下载 > php支持分块与断点续传文件下载功能代码

php支持分块与断点续传文件下载功能代码

本文章要介绍了这篇文章是一篇关于php流下载,就是可以支持分块与断点续传文件下载,有需要的朋友可以看看,代码如下:

<?php
$dowmFile = dirname(__FILE__) . '/Nokia - Always Here.mp3'; //要下载的文件,绝对或相对
$dowmName = 'Nokia - Always Here.mp3';
ob_start();
getlocalfile($dowmFile, $dowmName);
flush();
ob_flush();
function getlocalfile($fname, $filename = '') {
    $fsize = filesize($fname);
    header('Cache-Control: public');
    header('Pragma: public');
    header('Accept-Ranges: bytes');
    header('Connection: close');
    header('Content-Type: ' . MIMEType($fname));
    //header('Content-Type: application/octet-stream');
    if (isset($filename{0})) {
        header('Content-Disposition: attachment;filename=' . $filename);
    }
    if ($fp = @fopen($fname, 'rb')) {
        $start = 0;
        $end = $fsize;
        $isRange = isset($_SERVER['HTTP_RANGE']) && ($_SERVER['HTTP_RANGE'] != '');
        if ($isRange) {
            preg_match('/^bytes=([0-9]*)-([0-9]*)$/i', $_SERVER['HTTP_RANGE'], $match);
            $start = $match[1];
            $end = $match[2];
            $isset_start = isset($start{0});
            $isset_end = isset($end{0});
            if ($isset_start && $isset_end) {
                //分块下载
                if ($start >= $fsize || $start < 0 || $start > $end) {
                    $start = 0;
                    $end = $fsize;
                } else if ($end >= $fsize) {
                    $end = $fsize - $start;
                } else {
                    $end-= $start - 1;
                }
            } else if ($isset_start && !$isset_end) {
                //指定位置到结束
                if ($start >= $fsize || $start < 0) {
                    $start = 0;
                    $end = $fsize;
                } else {
                    $end = $fsize - $start;
                }
            } else if (!$isset_start && $isset_end) {
                //最后n个字节
                $end = $end > $fsize ? $fsize : $end;
                $start = $fsize - $end;
            } else {
                $start = 0;
                $end = $fsize;
            }
        }
        if ($isRange) {
            fseek($fp, $start);
            header('HTTP/1.1 206 Partial Content');
            header('Content-Length: ' . $end);
            header('Content-Ranges: bytes ' . $start . '-' . ($end + $start - 1) . '/' . $fsize);
        } else {
            header('Content-Length: ' . $fsize);
        }
        if (function_exists('fpassthru') && ($end + $start) == $fsize) {
            fpassthru($fp);
        } else {
            echo fread($fp, $end);
        }
    } else {
        header('Content-Length: ' . $fsize);
        readfile($fname);
    }
    //@header("Content-Type: ".mime_content_type($fname));
    
}
function MIMEType($fname) {
    $fileSuffix = strtolower(substr($fname, strrpos($fname, '.') + 1));
    switch ($fileSuffix) {
        case 'avi':
            return 'video/msvideo';
        case 'wmv':
            return 'video/x-ms-wmv';
        case 'txt':
            return 'text/plain';
        case 'htm':
        case 'html':
        case 'php':
            return 'text/html';
        case 'css':
            return 'text/css';
        case 'js':
            return 'application/javascript';
        case 'json':
        case 'xml':
        case 'zip':
        case 'pdf':
        case 'rtf':
        case 'tar':
            return 'application/' . $fileSuffix;
        case 'swf':
            return 'application/x-shockwave-flash';
        case 'flv':
            return 'video/x-flv';
        case 'jpe':
        case 'jpg':
            return 'image/jpeg';
        case 'jpeg':
        case 'png':
        case 'gif':
        case 'bmp':
        case 'tiff':
            return 'image/' . $fileSuffix;
        case 'ico':
            return 'image/vnd.microsoft.icon';
        case 'tif':
            return 'image/tiff';
        case 'svg':
        case 'svgz':
            return 'image/svg+xml';
        case 'rar':
            return 'application/x-rar-compressed';
        case 'exe':
        case 'msi':
            return 'application/x-msdownload';
        case 'cab':
            return 'application/vnd.ms-cab-compressed';
        case 'aif':
            return 'audio/aiff';
        case 'mpg':
        case 'mpe':
        case 'mp3':
            return 'audio/mpeg';
        case 'mpeg':
        case 'wav':
        case 'aiff':
            return 'audio/' . $fileSuffix;
        case 'qt':
        case 'mov':
            return 'video/quicktime';
        case 'psd':
            return 'image/vnd.adobe.photoshop';
        case 'ai':
        case 'eps':
        case 'ps':
            return 'application/postscript';
        case 'doc':
        case 'docx':
            return 'application/msword';
        case 'xls':
        case 'xlt':
        case 'xlm':
        case 'xld':
        case 'xla':
        case 'xlc':
        case 'xlw':
        case 'xll':
            return 'application/vnd.ms-excel';
        case 'ppt':
        case 'pps':
            return 'application/vnd.ms-powerpoint';
        case 'odt':
            return 'application/vnd.oasis.opendocument.text';
        case 'ods':
            return 'application/vnd.oasis.opendocument.spreadsheet';
        default: //开源代码phprm.com
            if (function_exists('mime_content_type')) {
                $fileSuffix = mime_content_type($filename);
            } else {
                $fileSuffix = 'application/octet-stream';
            }
            return $fileSuffix;
            break;
    }
}


本文地址:http://www.phprm.com/scxz/fs4990.html

转载随意,但请附上文章地址:-)

标签:php分块下载 php断点续传

相关文章

发表留言