1. This site uses cookies. By continuing to use this site, you are agreeing to our use of cookies. Learn More.

How To Force File Download Of A .php File?

Discussion in 'PHP & Perl' started by gimme4free, Sep 25, 2009.

  1. gimme4free

    gimme4free Executive VIP Jr. VIP Premium Member

    Joined:
    Oct 22, 2008
    Messages:
    1,881
    Likes Received:
    1,932
    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?
     
  2. drdankmendez

    drdankmendez Junior Member

    Joined:
    May 30, 2008
    Messages:
    194
    Likes Received:
    316
    Location:
    In front of my computer
    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...
     
  3. drdankmendez

    drdankmendez Junior Member

    Joined:
    May 30, 2008
    Messages:
    194
    Likes Received:
    316
    Location:
    In front of my computer
    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 Thanks x 1
  4. gimme4free

    gimme4free Executive VIP Jr. VIP Premium Member

    Joined:
    Oct 22, 2008
    Messages:
    1,881
    Likes Received:
    1,932
    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
     
  5. 00CivicEX

    00CivicEX Jr. VIP Jr. VIP Premium Member

    Joined:
    Mar 3, 2009
    Messages:
    293
    Likes Received:
    214
    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: Sep 25, 2009
  6. 00CivicEX

    00CivicEX Jr. VIP Jr. VIP Premium Member

    Joined:
    Mar 3, 2009
    Messages:
    293
    Likes Received:
    214
    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');