fork download
  1. class download
  2. {
  3. var $properties = array ('old_name' => "", 'new_name' => "", 'type' => "", 'size' => "", 'resume' => "", 'max_speed' => "" );
  4. var $range = 0;
  5. function download($path, $name = "", $resume = 0, $max_speed = 0)
  6. {
  7. $name = ($name == "") ? substr(strrchr("/" . $path, "/" ), 1 ) : $name;
  8. $name = explode("/", $name );
  9. $name = end($name );
  10. $file_size = @filesize($path );
  11. $this->properties = array ('old_name' => $path, 'new_name' => $name, 'type' => "application/force-download", 'size' => $file_size, 'resume' => $resume, 'max_speed' => $max_speed );
  12. if($this->properties['resume'])
  13. {
  14. if(isset($_SERVER['HTTP_RANGE']))
  15. {
  16. $this->range = $_SERVER['HTTP_RANGE'];
  17. $this->range = str_replace("bytes=", "", $this->range );
  18. $this->range = str_replace("-", "", $this->range );
  19. }
  20. else $this->range = 0;
  21. if($this->range > $this->properties['size']) $this->range = 0;
  22. }
  23. else $this->range = 0;
  24. }
  25. function download_file()
  26. {
  27. if($this->range) header($_SERVER['SERVER_PROTOCOL']." 206 Partial Content");
  28. else header($_SERVER['SERVER_PROTOCOL']." 200 OK");
  29. header("Pragma: public");
  30. header("Expires: 0");
  31. header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
  32. header("Cache-Control: private", false);
  33. header("Content-Type: " . $this->properties['type']);
  34. header('Content-Disposition: attachment; filename="' . $this->properties['new_name'] . '";');
  35. header("Content-Transfer-Encoding: binary");
  36. if($this->properties['resume']) header("Accept-Ranges: bytes");
  37. if($this->range)
  38. {
  39. header("Content-Range: bytes {$this->range}-" . ($this->properties['size'] - 1) . "/" . $this->properties['size']);
  40. header("Content-Length: " . ($this->properties['size'] - $this->range));
  41. }
  42. else header("Content-Length: " . $this->properties['size']);
  43. @ini_set('max_execution_time', 0);
  44. $this->_download($this->properties['old_name'], $this->range );
  45. }
  46. function _download($filename, $range = 0)
  47. {
  48. if(($speed = $this->properties['max_speed']) > 0 ) $sleep_time = (8 / $speed) * 1e6;
  49. else $sleep_time = 0;
  50. $handle = fopen($filename, 'rb');
  51. fseek($handle, $range);
  52. if($handle === false) return false;
  53. while (!feof($handle))
  54. {
  55. print(fread($handle, 1024 * 8));
  56. flush();
  57. usleep($sleep_time);
  58. }
  59. fclose($handle);
  60. return true;
  61. }
  62. }
Success #stdin #stdout 0.02s 52472KB
stdin
Standard input is empty
stdout
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;
	}
}