class download
{
var $properties = array ('old_name' => "", 'new_name' => "", 'type' => "", 'size' => "", 'resume' => "", 'max_speed' => "" ); var $range = 0;
function download($path, $name = "", $resume = 0, $max_speed = 0)
{
$name = ($name == "") ?
substr(strrchr("/" . $path, "/" ), 1 ) : $name; $this->properties = array ('old_name' => $path, 'new_name' => $name, 'type' => "application/force-download", 'size' => $file_size, 'resume' => $resume, 'max_speed' => $max_speed ); if($this->properties['resume'])
{
if(isset($_SERVER['HTTP_RANGE'])) {
$this->range = $_SERVER['HTTP_RANGE']; }
if($this->range > $this->properties['size']) $this->range = 0; }
}
function download_file()
{
if($this->range) header($_SERVER['SERVER_PROTOCOL']." 206 Partial Content"); else header($_SERVER['SERVER_PROTOCOL']." 200 OK"); header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); header("Cache-Control: private", false); header("Content-Type: " . $this->properties['type']); header('Content-Disposition: attachment; filename="' . $this->properties['new_name'] . '";'); header("Content-Transfer-Encoding: binary"); if($this->properties['resume']) header("Accept-Ranges: bytes"); {
header("Content-Range: bytes {$this->range}-" . ($this->properties['size'] - 1) . "/" . $this->properties['size']); header("Content-Length: " . ($this->properties['size'] - $this->range)); }
else header("Content-Length: " . $this->properties['size']); $this->_download
($this->properties['old_name'], $this->range ); }
function _download($filename, $range = 0)
{
if(($speed = $this->properties['max_speed']) > 0 ) $sleep_time = (8 / $speed) * 1e6;
else $sleep_time = 0;
$handle = fopen($filename, 'rb'); if($handle === false) return false;
{
print(fread($handle, 1024 * 8)); }
return true;
}
}
Y2xhc3MgZG93bmxvYWQKewoJdmFyICRwcm9wZXJ0aWVzID0gYXJyYXkgKCdvbGRfbmFtZScgPT4gIiIsICduZXdfbmFtZScgPT4gIiIsICd0eXBlJyA9PiAiIiwgJ3NpemUnID0+ICIiLCAncmVzdW1lJyA9PiAiIiwgJ21heF9zcGVlZCcgPT4gIiIgKTsKCXZhciAkcmFuZ2UgPSAwOwoJZnVuY3Rpb24gZG93bmxvYWQoJHBhdGgsICRuYW1lID0gIiIsICRyZXN1bWUgPSAwLCAkbWF4X3NwZWVkID0gMCkKCXsJCgkJJG5hbWUgPSAoJG5hbWUgPT0gIiIpID8gc3Vic3RyKHN0cnJjaHIoIi8iIC4gJHBhdGgsICIvIiApLCAxICkgOiAkbmFtZTsKCQkkbmFtZSA9IGV4cGxvZGUoIi8iLCAkbmFtZSApOwoJCSRuYW1lID0gZW5kKCRuYW1lICk7CgkJJGZpbGVfc2l6ZSA9IEBmaWxlc2l6ZSgkcGF0aCApOwoJCSR0aGlzLT5wcm9wZXJ0aWVzID0gYXJyYXkgKCdvbGRfbmFtZScgPT4gJHBhdGgsICduZXdfbmFtZScgPT4gJG5hbWUsICd0eXBlJyA9PiAiYXBwbGljYXRpb24vZm9yY2UtZG93bmxvYWQiLCAnc2l6ZScgPT4gJGZpbGVfc2l6ZSwgJ3Jlc3VtZScgPT4gJHJlc3VtZSwgJ21heF9zcGVlZCcgPT4gJG1heF9zcGVlZCApOwoJCWlmKCR0aGlzLT5wcm9wZXJ0aWVzWydyZXN1bWUnXSkgCgkJewoJCQlpZihpc3NldCgkX1NFUlZFUlsnSFRUUF9SQU5HRSddKSkgCgkJCXsJCQoJCQkJJHRoaXMtPnJhbmdlID0gJF9TRVJWRVJbJ0hUVFBfUkFOR0UnXTsKCQkJCSR0aGlzLT5yYW5nZSA9IHN0cl9yZXBsYWNlKCJieXRlcz0iLCAiIiwgJHRoaXMtPnJhbmdlICk7CgkJCQkkdGhpcy0+cmFuZ2UgPSBzdHJfcmVwbGFjZSgiLSIsICIiLCAkdGhpcy0+cmFuZ2UgKTsJCgkJCX0KCQkJZWxzZSAkdGhpcy0+cmFuZ2UgPSAwOwkJCQoJCQlpZigkdGhpcy0+cmFuZ2UgPiAkdGhpcy0+cHJvcGVydGllc1snc2l6ZSddKSAkdGhpcy0+cmFuZ2UgPSAwOwoJCX0gCgkJZWxzZSAkdGhpcy0+cmFuZ2UgPSAwOwoJfQoJZnVuY3Rpb24gZG93bmxvYWRfZmlsZSgpIAoJewoJCWlmKCR0aGlzLT5yYW5nZSkgaGVhZGVyKCRfU0VSVkVSWydTRVJWRVJfUFJPVE9DT0wnXS4iIDIwNiBQYXJ0aWFsIENvbnRlbnQiKTsKCQllbHNlIGhlYWRlcigkX1NFUlZFUlsnU0VSVkVSX1BST1RPQ09MJ10uIiAyMDAgT0siKTsKCQloZWFkZXIoIlByYWdtYTogcHVibGljIik7CgkJaGVhZGVyKCJFeHBpcmVzOiAwIik7CgkJaGVhZGVyKCJDYWNoZS1Db250cm9sOiBtdXN0LXJldmFsaWRhdGUsIHBvc3QtY2hlY2s9MCwgcHJlLWNoZWNrPTAiKTsgCgkJaGVhZGVyKCJDYWNoZS1Db250cm9sOiBwcml2YXRlIiwgZmFsc2UpOwoJCWhlYWRlcigiQ29udGVudC1UeXBlOiAiIC4gJHRoaXMtPnByb3BlcnRpZXNbJ3R5cGUnXSk7CgkJaGVhZGVyKCdDb250ZW50LURpc3Bvc2l0aW9uOiBhdHRhY2htZW50OyBmaWxlbmFtZT0iJyAuICR0aGlzLT5wcm9wZXJ0aWVzWyduZXdfbmFtZSddIC4gJyI7Jyk7CgkJaGVhZGVyKCJDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiBiaW5hcnkiKTsKCQlpZigkdGhpcy0+cHJvcGVydGllc1sncmVzdW1lJ10pIGhlYWRlcigiQWNjZXB0LVJhbmdlczogYnl0ZXMiKTsKCQlpZigkdGhpcy0+cmFuZ2UpIAoJCXsKCQkJaGVhZGVyKCJDb250ZW50LVJhbmdlOiBieXRlcyB7JHRoaXMtPnJhbmdlfS0iIC4gKCR0aGlzLT5wcm9wZXJ0aWVzWydzaXplJ10gLSAxKSAuICIvIiAuICR0aGlzLT5wcm9wZXJ0aWVzWydzaXplJ10pOwoJCQloZWFkZXIoIkNvbnRlbnQtTGVuZ3RoOiAiIC4gKCR0aGlzLT5wcm9wZXJ0aWVzWydzaXplJ10gLSAkdGhpcy0+cmFuZ2UpKTsKCQl9IAoJCWVsc2UgaGVhZGVyKCJDb250ZW50LUxlbmd0aDogIiAuICR0aGlzLT5wcm9wZXJ0aWVzWydzaXplJ10pOwoJCUBpbmlfc2V0KCdtYXhfZXhlY3V0aW9uX3RpbWUnLCAwKTsKCQlAc2V0X3RpbWVfbGltaXQoKTsKCQkkdGhpcy0+X2Rvd25sb2FkKCR0aGlzLT5wcm9wZXJ0aWVzWydvbGRfbmFtZSddLCAkdGhpcy0+cmFuZ2UgKTsKCX0KCWZ1bmN0aW9uIF9kb3dubG9hZCgkZmlsZW5hbWUsICRyYW5nZSA9IDApCgl7CgkJQG9iX2VuZF9jbGVhbigpOwoJCWlmKCgkc3BlZWQgPSAkdGhpcy0+cHJvcGVydGllc1snbWF4X3NwZWVkJ10pID4gMCApICRzbGVlcF90aW1lID0gKDggLyAkc3BlZWQpICogMWU2OwoJCWVsc2UgJHNsZWVwX3RpbWUgPSAwOwoJCSRoYW5kbGUgPSBmb3BlbigkZmlsZW5hbWUsICdyYicpOwoJCWZzZWVrKCRoYW5kbGUsICRyYW5nZSk7CgkJaWYoJGhhbmRsZSA9PT0gZmFsc2UpIHJldHVybiBmYWxzZTsKCQl3aGlsZSAoIWZlb2YoJGhhbmRsZSkpIAoJCXsKCQkJcHJpbnQoZnJlYWQoJGhhbmRsZSwgMTAyNCAqIDgpKTsKCQkJb2JfZmx1c2goKTsKCQkJZmx1c2goKTsKCQkJdXNsZWVwKCRzbGVlcF90aW1lKTsKCQl9CgkJZmNsb3NlKCRoYW5kbGUpOwoJCXJldHVybiB0cnVlOwoJfQp9
class download
{
var $properties = array ('old_name' => "", 'new_name' => "", 'type' => "", 'size' => "", 'resume' => "", 'max_speed' => "" );
var $range = 0;
function download($path, $name = "", $resume = 0, $max_speed = 0)
{
$name = ($name == "") ? substr(strrchr("/" . $path, "/" ), 1 ) : $name;
$name = explode("/", $name );
$name = end($name );
$file_size = @filesize($path );
$this->properties = array ('old_name' => $path, 'new_name' => $name, 'type' => "application/force-download", 'size' => $file_size, 'resume' => $resume, 'max_speed' => $max_speed );
if($this->properties['resume'])
{
if(isset($_SERVER['HTTP_RANGE']))
{
$this->range = $_SERVER['HTTP_RANGE'];
$this->range = str_replace("bytes=", "", $this->range );
$this->range = str_replace("-", "", $this->range );
}
else $this->range = 0;
if($this->range > $this->properties['size']) $this->range = 0;
}
else $this->range = 0;
}
function download_file()
{
if($this->range) header($_SERVER['SERVER_PROTOCOL']." 206 Partial Content");
else header($_SERVER['SERVER_PROTOCOL']." 200 OK");
header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: private", false);
header("Content-Type: " . $this->properties['type']);
header('Content-Disposition: attachment; filename="' . $this->properties['new_name'] . '";');
header("Content-Transfer-Encoding: binary");
if($this->properties['resume']) header("Accept-Ranges: bytes");
if($this->range)
{
header("Content-Range: bytes {$this->range}-" . ($this->properties['size'] - 1) . "/" . $this->properties['size']);
header("Content-Length: " . ($this->properties['size'] - $this->range));
}
else header("Content-Length: " . $this->properties['size']);
@ini_set('max_execution_time', 0);
@set_time_limit();
$this->_download($this->properties['old_name'], $this->range );
}
function _download($filename, $range = 0)
{
@ob_end_clean();
if(($speed = $this->properties['max_speed']) > 0 ) $sleep_time = (8 / $speed) * 1e6;
else $sleep_time = 0;
$handle = fopen($filename, 'rb');
fseek($handle, $range);
if($handle === false) return false;
while (!feof($handle))
{
print(fread($handle, 1024 * 8));
ob_flush();
flush();
usleep($sleep_time);
}
fclose($handle);
return true;
}
}