Zurück zur PHP-Seite

<?php
// Chunk size in KB
define("CHUNK_SIZE_KB"8);

/**
 * Resumable Download
 * enables resumable, chunked downloads
 * based on code posted in comments to fread (http://php.net/fread)
 * @param string $file Complete file name and path
 */
function resumable_download($file) {
  
// Abort if file does not exist
  
if (!is_file($file)) {
    die(
"File not found.");
  }

  
// Start sending HTTP headers (do not print anything before this point!)
  
header("Content-Type: application/octet-stream");
  
header("Accept-Ranges: bytes");
  
header("Content-Transfer-Encoding: binary");

  
// Filename presetting
  
$filename basename($file);
  if (
strstr($_SERVER['HTTP_USER_AGENT'], "MSIE")) {
     
# workaround for IE filename bug with multiple periods / multiple dots
     # in filename that adds square brackets to filename -
     # e.g. setup.abc.exe becomes setup[1].abc.exe
     
$iefilename preg_replace('/\./''%2e'$filenamesubstr_count($filename'.') - 1);
     
header("Content-Disposition: attachment; filename=\"$iefilename\"");
   } else {
     
header("Content-Disposition: attachment; filename=\"$filename\"");
   }

  
// Calculate file size
  
$size filesize($file);
  
$size2 $size-1;

  
// Check if http_range is sent by browser (or download manager)
  
if (isset($_SERVER['HTTP_RANGE'])) {
    list(
$a$range) = explode("="$_SERVER['HTTP_RANGE']);
    
// if yes, download missing part
    
str_replace($range"-"$range);
    
$new_length $size2-$range;
    
header("HTTP/1.1 206 Partial Content");
    
header("Content-Length: $new_length");
    
header("Content-Range: bytes $range$size2/$size");
  } else {
    
header("Content-Range: bytes 0-$size2/$size");
    
header("Content-Length: ".$size);
  }

  
// Open file
  
$fp fopen($file"rb");
  if (
$fp === false) {
    die(
"Invalid file pointer.");
  }

  
// Seek to start of missing part
  
fseek($fp,$range);
  
// Reset time limit for big files
  
set_time_limit(0);
  
// Start buffered download
  
while (!feof($fp)) {
    echo 
fread($fpCHUNK_SIZE_KB 1024);
    
flush();
    
ob_flush();
  }
  
fclose($fp);

  
// Exit, closing connection
  
exit;
}
?>