0) @ob_end_clean(); switch ($inline_mode) { case 0: $disposition = 'attachment'; break; case 1: $disposition = 'inline'; break; case 2: $disposition = self::wellKnownInlineFile($file_extension) ? 'inline' : 'attachment'; break; default: throw new Exception('Invalid value for inline_mode'); } if(ini_get('zlib.output_compression')){ ini_set('zlib.output_compression', 'Off'); } header('Content-Type: ' . $mime_type); $ua = isset($_SERVER['HTTP_USER_AGENT']) ? strtoupper($_SERVER['HTTP_USER_AGENT']) : ''; if (strstr($ua, 'MSIE')) { $name_msie = preg_replace('/\./', '%2e', $name, substr_count($name, '.') - 1); header('Content-Disposition: '.$disposition.';filename="'.$name_msie.'"'); } else if (strstr($ua, 'FIREFOX')) { // TODO: Implement "encodeRFC5987ValueChars" described at https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Global_Objects/encodeURIComponent ? $name_utf8 = mb_convert_encoding($name, 'UTF-8'); header('Content-Disposition: '.$disposition.';filename*="UTF-8\'\''.$name_utf8.'"'); } else { // Note: There is possibly a bug in Google Chrome: https://stackoverflow.com/questions/61866508/chrome-ignores-content-disposition-filename header('Content-Disposition: '.$disposition.';filename="'.$name.'"'); } header('Content-Transfer-Encoding: binary'); header('Accept-Ranges: bytes'); header('Cache-Control: public'); if (isset($_SERVER['HTTP_RANGE'])) { list($a, $range) = explode("=",$_SERVER['HTTP_RANGE'],2); list($range) = explode(",",$range,2); list($range, $range_end) = explode("-", $range); $range=intval($range); if(!$range_end) { $range_end=$size-1; } else { $range_end=intval($range_end); } $new_length = $range_end-$range+1; http_response_code(206); // 206 Partial Content header("Content-Length: $new_length"); header("Content-Range: bytes $range-$range_end/$size"); } else { $range = 0; $etag = md5_file($file); header("Etag: $etag"); if (isset($_SERVER['HTTP_IF_NONE_MATCH']) && (trim($_SERVER['HTTP_IF_NONE_MATCH']) == $etag)) { http_response_code(304); // 304 Not Modified return true; } $new_length=$size; header("Content-Length: ".$size); header('Content-MD5: '.$etag); // RFC 2616 clause 14.15 } set_time_limit(0); $chunksize = 1*(1024*1024); $bytes_send = 0; if ($file = fopen($file, 'r')) { if(isset($_SERVER['HTTP_RANGE'])) fseek($file, $range); while(!feof($file) && (!connection_aborted()) && // connection_status() == 0 ($bytes_send<$new_length)) { $buffer = fread($file, $chunksize); echo($buffer); flush(); $bytes_send += strlen($buffer); } fclose($file); } else { throw new Exception("Cannot open file $file"); } return((connection_status() == 0) and !connection_aborted()); } }