will force downloading consume by bandwidth?

Discussion in 'Programming' started by demonator09, Oct 28, 2008.

  1. #1
    This is the code of one of my php files. When this php file is accessed it forces a download of a file hosted on a remote server. So when 'http://mywebsite.com/myfile.php' is accessed 'http://remotewebsite.com/remotefile.exe' will start downloading.
    So my question is whether the file is transferred through my server to the user or is it directly transferred to the user?
    Will my server bandwidth be used in this transfer?


    function output_file($file, $name, $mime_type='')
    {
     /*
     This function takes a path to a file to output ($file), 
     the filename that the browser will see ($name) and 
     the MIME type of the file ($mime_type, optional).
     
     If you want to do something on download abort/finish,
     register_shutdown_function('function_name');
     */
     
     if(!is_readable($file)) {
     $size = remote_filesize($file);
     }
     else {
     $size = filesize($file);
     }
     $name = rawurldecode($name);
     
     /* Figure out the MIME type (if not specified) */
     $known_mime_types=array(
     	"pdf" => "application/pdf",
     	"txt" => "text/plain",
     	"html" => "text/html",
     	"htm" => "text/html",
    	"exe" => "application/octet-stream",
    	"zip" => "application/zip",
    	"doc" => "application/msword",
    	"xls" => "application/vnd.ms-excel",
    	"ppt" => "application/vnd.ms-powerpoint",
    	"gif" => "image/gif",
    	"png" => "image/png",
    	"jpeg"=> "image/jpg",
    	"jpg" =>  "image/jpg",
    	"php" => "text/plain"
     );
     
     if($mime_type==''){
    	 $file_extension = strtolower(substr(strrchr($file,"."),1));
    	 if(array_key_exists($file_extension, $known_mime_types)){
    		$mime_type=$known_mime_types[$file_extension];
    	 } else {
    		$mime_type="application/force-download";
    	 };
     };
     
     @ob_end_clean(); //turn off output buffering to decrease cpu usage
     
     // required for IE, otherwise Content-Disposition may be ignored
     if(ini_get('zlib.output_compression'))
      ini_set('zlib.output_compression', 'Off');
     
     header('Content-Type: ' . $mime_type);
     header('Content-Disposition: attachment; filename="'.$name.'"');
     header("Content-Transfer-Encoding: binary");
     header('Accept-Ranges: bytes');
     
     /* The three lines below basically make the 
        download non-cacheable */
     header("Cache-control: private");
     header('Pragma: private');
     header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
     
     // multipart-download and download resuming support
     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;
    	header("HTTP/1.1 206 Partial Content");
    	header("Content-Length: $new_length");
    	header("Content-Range: bytes $range-$range_end/$size");
     } else {
    	$new_length=$size;
    	header("Content-Length: ".$size);
     }
     
     /* output the file itself */
     $chunksize = 1*(1024*1024); //you may want to change this
     $bytes_send = 0;
     if ($file = fopen($file, 'r'))
     {
    	if(isset($_SERVER['HTTP_RANGE']))
    	fseek($file, $range);
     
    	while(!feof($file) && 
    		(!connection_aborted()) && 
    		($bytes_send<$new_length)
    	      )
    	{
    		$buffer = fread($file, $chunksize);
    		print($buffer); //echo($buffer); // is also possible
    		flush();
    		$bytes_send += strlen($buffer);
    	}
     fclose($file);
     } else die('Error - can not open file.');
     
    die();
    }
    PHP:

     
    demonator09, Oct 28, 2008 IP
  2. Bohra

    Bohra Prominent Member

    Messages:
    12,573
    Likes Received:
    537
    Best Answers:
    0
    Trophy Points:
    310
    #2
    No it wont take ur bandwith... Unless ur script downloads the file and provides it to the users
     
    Bohra, Oct 28, 2008 IP
  3. happpy

    happpy Well-Known Member

    Messages:
    926
    Likes Received:
    14
    Best Answers:
    0
    Trophy Points:
    120
    #3
    your server will use the double bandwidth of the filesize

    it fetches the file from the remote and hands it over to the enduser.
     
    happpy, Oct 28, 2008 IP
  4. Bohra

    Bohra Prominent Member

    Messages:
    12,573
    Likes Received:
    537
    Best Answers:
    0
    Trophy Points:
    310
    #4
    force download does that ???
     
    Bohra, Oct 28, 2008 IP
  5. demonator09

    demonator09 Peon

    Messages:
    235
    Likes Received:
    3
    Best Answers:
    0
    Trophy Points:
    0
    #5
    So i did a little experiment. I saved this php file on my computer on my localhost and I made it to force downloaded a zip file from my website. I put the force download link in my download manager and started the download. Once the the download was started I turned off my localhost so that the php file was no longer accessible and the download still continued. But when I paused the download and started it again it failed. So I think the php file is only used to connect to the actual download file. Once the connection is established the file is directly downloaded. So what do you guys think?

    Is there anyone who knows exactly what happens?
     
    demonator09, Oct 28, 2008 IP
  6. Bohra

    Bohra Prominent Member

    Messages:
    12,573
    Likes Received:
    537
    Best Answers:
    0
    Trophy Points:
    310
    #6
    Till i know it doesnt use ur bandwith because i used to use php download manager scripts which i suppose had the url option and it used Force downloads my bandwith wasnt used
     
    Bohra, Oct 28, 2008 IP
  7. happpy

    happpy Well-Known Member

    Messages:
    926
    Likes Received:
    14
    Best Answers:
    0
    Trophy Points:
    120
    #7
    whatever you say guys,

    the above posted script reads the file from a remote location and hands it over to the enduser.

    everyone with half a brain will realize that this will first take the file´s size as bandwidth to get the file to the "yourserver" from the "remoteserver"
    and then take again the file´s size as bandwidth from the "yourserver" to the user.
     
    happpy, Oct 28, 2008 IP