How To Force File Download Of A .php File?

gimme4free

Elite Member
Joined
Oct 22, 2008
Messages
1,935
Reaction score
1,989
How can I force a .php extension file to be downloaded onto the users PC instead of being run by the server? I know that it is possible but at the moment I do not know how. Any ideas?
 
You should be able to change the headers to force the download. Try something like:


Code:
Header( "Content-Type: application/octet-stream" );
Header( "Content-Length:" . filesize( $pathToFile) );
Header( "Content-Disposition: attatchment; filename=$pathToFile" );
readfile( $pathToFile);

I did something like this a couple years ago and I think this is how I ended up doing it...If you have any questions or it doesn't work, let me know.

Hope this helps...
 
I just ran a test on it and it should work for what you want to do. Here is how I used it:

fileLoader.php
Code:
$pathToFile = 'fileToDownload.php';
Header( "Content-Type: application/octet-stream" );
Header( "Content-Length:" . filesize( $pathToFile) );
Header( "Content-Disposition: attatchment; filename=$pathToFile" );
readfile( $pathToFile);


fileToDownload.php
Code:
//This is the php file you want to force the download of...
//This is the php file you want to force the download of...
//This is the php file you want to force the download of...
//This is the php file you want to force the download of...
//This is the php file you want to force the download of...
//This is the php file you want to force the download of...
//This is the php file you want to force the download of...
//This is the php file you want to force the download of...


Just upload both files to the same directory and visit fileLoader.php and it will force the download of fileToDownload.php

Hope this helps...
 
Thanks, I just wasnt sure if this was a very safe way to do it :)

I have a few security precautions in place though with random numbers etc
 
Here is something a little more complex. Same Concept but with alot more error protections in it.

PHP:
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)) die('File not found or inaccessible!');
 
 $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");

Continued on next post...
 
Last edited:
PHP:
// 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();
} 
 
/*********************************************
   Example of use
**********************************************/ 
 
/* 
Make sure script execution doesn't time out.
Set maximum execution time in seconds (0 means no limit).
*/
set_time_limit(0); 
$file_path='that_one_file.txt';
output_file($file_path, 'some file.txt', 'text/plain');
 
Back
Top