PHP output file on disk to browser

前端 未结 6 2044
轻奢々
轻奢々 2020-11-27 19:18

I want to serve an existing file to the browser in PHP. I\'ve seen examples about image/jpeg but that function seems to save a file to disk and you have to create a right si

相关标签:
6条回答
  • 2020-11-27 19:55

    There is fpassthru() that should do exactly what you need. See the manual entry to read about the following example:

    <?php
    
    // open the file in a binary mode
    $name = './img/ok.png';
    $fp = fopen($name, 'rb');
    
    // send the right headers
    header("Content-Type: image/png");
    header("Content-Length: " . filesize($name));
    
    // dump the picture and stop the script
    fpassthru($fp);
    exit;
    
    ?>
    

    See here for all of PHP's filesystem functions.

    If it's a binary file you want to offer for download, you probably also want to send the right headers so the "Save as.." dialog pops up. See the 1st answer to this question for a good example on what headers to send.

    0 讨论(0)
  • 2020-11-27 19:56

    For both my website and websites I create for clients I use a PHP script that I found a long time ago.

    It can be found here: http://www.zubrag.com/scripts/download.php

    I use a slightly modified version of it to allow me to obfuscate the file system structure (which it does by default) in addition to not allowing hot linking (default) and I added some additional tracking features, such as referrer, IP (default), and other such data that I might need should something come up.

    Hope this helps.

    0 讨论(0)
  • 2020-11-27 20:03

    This should get you started: http://de.php.net/manual/en/function.readfile.php

    Edit: If your web server supports it, using

    header('X-Sendfile: ' . $filename);
    

    where file name contains a local path like

    /var/www/www.example.org/downloads/example.zip
    

    is faster than readfile().

    (usual security considerations for using header() apply)

    0 讨论(0)
  • 2020-11-27 20:12

    I use readfile() ( http://www.php.net/readfile )...

    But you have to make sure you set the right "Content-Type" with header() so the browser knows what to do with the file.

    You can also force the browser to download the file instead of trying to use a plug-in to display it (like for PDFs), I always found this to look a bit "hacky", but it is explained at the above link.

    0 讨论(0)
  • 2020-11-27 20:16

    I use this

      if (file_exists($file)) {
    
    
            header('Content-Description: File Transfer');
            header('Content-Type: application/octet-stream');
            header('Content-Disposition: attachment; filename='.basename($file));
            header('Content-Transfer-Encoding: binary');
            header('Expires: 0');
            header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
            header('Pragma: public');
            header('Content-Length: ' . filesize($file));
    
            ob_clean();
            flush();
            readfile($file);
            exit;
    
        } 
    
    0 讨论(0)
  • 2020-11-27 20:22

    Following will initiate XML file output

    $fp = fopen($file_name, 'rb');
    
    // Set the header
    header("Content-Type: text/xml");
    header("Content-Length: " . filesize($file_name));
    header('Content-Disposition: attachment; filename="'.$file_name.'"');
    
    fpassthru($fp);
    exit;
    

    The 'Content-Disposition: attachment' is pretty common and is used by sites like Facebook to set the right header

    0 讨论(0)
提交回复
热议问题