Resumable downloads when using PHP to send the file?

后端 未结 13 1189
梦毁少年i
梦毁少年i 2020-11-22 12:22

We are using a PHP scripting for tunnelling file downloads, since we don\'t want to expose the absolute path of downloadable file:

header(\"Content-Type: $ct         


        
13条回答
  •  予麋鹿
    予麋鹿 (楼主)
    2020-11-22 13:02

    This works 100% super check it I am using it and no problems any more.

            /* Function: download with resume/speed/stream options */
    
    
             /* List of File Types */
            function fileTypes($extension){
                $fileTypes['swf'] = 'application/x-shockwave-flash';
                $fileTypes['pdf'] = 'application/pdf';
                $fileTypes['exe'] = 'application/octet-stream';
                $fileTypes['zip'] = 'application/zip';
                $fileTypes['doc'] = 'application/msword';
                $fileTypes['xls'] = 'application/vnd.ms-excel';
                $fileTypes['ppt'] = 'application/vnd.ms-powerpoint';
                $fileTypes['gif'] = 'image/gif';
                $fileTypes['png'] = 'image/png';
                $fileTypes['jpeg'] = 'image/jpg';
                $fileTypes['jpg'] = 'image/jpg';
                $fileTypes['rar'] = 'application/rar';
    
                $fileTypes['ra'] = 'audio/x-pn-realaudio';
                $fileTypes['ram'] = 'audio/x-pn-realaudio';
                $fileTypes['ogg'] = 'audio/x-pn-realaudio';
    
                $fileTypes['wav'] = 'video/x-msvideo';
                $fileTypes['wmv'] = 'video/x-msvideo';
                $fileTypes['avi'] = 'video/x-msvideo';
                $fileTypes['asf'] = 'video/x-msvideo';
                $fileTypes['divx'] = 'video/x-msvideo';
    
                $fileTypes['mp3'] = 'audio/mpeg';
                $fileTypes['mp4'] = 'audio/mpeg';
                $fileTypes['mpeg'] = 'video/mpeg';
                $fileTypes['mpg'] = 'video/mpeg';
                $fileTypes['mpe'] = 'video/mpeg';
                $fileTypes['mov'] = 'video/quicktime';
                $fileTypes['swf'] = 'video/quicktime';
                $fileTypes['3gp'] = 'video/quicktime';
                $fileTypes['m4a'] = 'video/quicktime';
                $fileTypes['aac'] = 'video/quicktime';
                $fileTypes['m3u'] = 'video/quicktime';
                return $fileTypes[$extention];
            };
    
            /*
              Parameters: downloadFile(File Location, File Name,
              max speed, is streaming
              If streaming - videos will show as videos, images as images
              instead of download prompt
             */
    
            function downloadFile($fileLocation, $fileName, $maxSpeed = 100, $doStream = false) {
                if (connection_status() != 0)
                    return(false);
            //    in some old versions this can be pereferable to get extention
            //    $extension = strtolower(end(explode('.', $fileName)));
                $extension = pathinfo($fileName, PATHINFO_EXTENSION);
    
                $contentType = fileTypes($extension);
                header("Cache-Control: public");
                header("Content-Transfer-Encoding: binary\n");
                header('Content-Type: $contentType');
    
                $contentDisposition = 'attachment';
    
                if ($doStream == true) {
                    /* extensions to stream */
                    $array_listen = array('mp3', 'm3u', 'm4a', 'mid', 'ogg', 'ra', 'ram', 'wm',
                        'wav', 'wma', 'aac', '3gp', 'avi', 'mov', 'mp4', 'mpeg', 'mpg', 'swf', 'wmv', 'divx', 'asf');
                    if (in_array($extension, $array_listen)) {
                        $contentDisposition = 'inline';
                    }
                }
    
                if (strstr($_SERVER['HTTP_USER_AGENT'], "MSIE")) {
                    $fileName = preg_replace('/\./', '%2e', $fileName, substr_count($fileName, '.') - 1);
                    header("Content-Disposition: $contentDisposition;
                        filename=\"$fileName\"");
                } else {
                    header("Content-Disposition: $contentDisposition;
                        filename=\"$fileName\"");
                }
    
                header("Accept-Ranges: bytes");
                $range = 0;
                $size = filesize($fileLocation);
    
                if (isset($_SERVER['HTTP_RANGE'])) {
                    list($a, $range) = explode("=", $_SERVER['HTTP_RANGE']);
                    str_replace($range, "-", $range);
                    $size2 = $size - 1;
                    $new_length = $size - $range;
                    header("HTTP/1.1 206 Partial Content");
                    header("Content-Length: $new_length");
                    header("Content-Range: bytes $range$size2/$size");
                } else {
                    $size2 = $size - 1;
                    header("Content-Range: bytes 0-$size2/$size");
                    header("Content-Length: " . $size);
                }
    
                if ($size == 0) {
                    die('Zero byte file! Aborting download');
                }
                set_magic_quotes_runtime(0);
                $fp = fopen("$fileLocation", "rb");
    
                fseek($fp, $range);
    
                while (!feof($fp) and ( connection_status() == 0)) {
                    set_time_limit(0);
                    print(fread($fp, 1024 * $maxSpeed));
                    flush();
                    ob_flush();
                    sleep(1);
                }
                fclose($fp);
    
                return((connection_status() == 0) and ! connection_aborted());
            }
    
            /* Implementation */
            // downloadFile('path_to_file/1.mp3', '1.mp3', 1024, false);
    

提交回复
热议问题