2

I have built a simple file manager where users can download any type of file such as pdf, word or gif files. I want all of them to download file rather than view it in browsers. The uploaded filenames are stored in database.

Julien Roncaglia
  • 17,397
  • 4
  • 57
  • 75
ktm
  • 6,025
  • 24
  • 69
  • 95
  • 3
    possible duplicate of [Forcing to download a file using PHP](http://stackoverflow.com/questions/1465573/forcing-to-download-a-file-using-php) – Randolpho Sep 15 '10 at 15:10
  • This has been asked a dozen or more times on this site. – Randolpho Sep 15 '10 at 15:11
  • I am asking for multi format download, not just pdf. I would like th eclients to download word, excel, gif as well – ktm Sep 15 '10 at 15:49

5 Answers5

6
<?php
// We'll be outputting a PDF
header('Content-type: application/pdf');

// It will be called downloaded.pdf
header('Content-Disposition: attachment; filename="downloaded.pdf"');

// The PDF source is in original.pdf
readfile('original.pdf');
?> 

http://php.net/manual/en/function.header.php

Raj Kaimal
  • 8,304
  • 27
  • 18
5

You can use the "Content-Disposition" header for that:

header("Content-Disposition: attachment");

The PHP manual provides an excellent example for that.

Lekensteyn
  • 64,486
  • 22
  • 159
  • 192
2

Normally setting the Content-Disposition to attachment before sending a file force a download by the browser.

You either need to configure your web server to provide this header for the files or send them yourself via PHP, sending a specific header before like :

header('Content-Disposition: attachment; filename=your_file_name.pdf');

Beware that the first solution is better as you won't risk your downloads being cut because the script running time is too long (you could also alter it).

Julien Roncaglia
  • 17,397
  • 4
  • 57
  • 75
0
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT\n");
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
header("Content-type: application/pdf;\n");
$len = filesize($filename);
header("Content-Length: $len;\n");
header("Content-Disposition: attachment; filename=\"downfile.pdf\";\n\n");
echo readfile($filename)
Flask
  • 4,966
  • 1
  • 20
  • 39
  • 1
    If you want to avoid caching, you'd better to use the `Cache-Control: no-cache` header. Those newlines (`\n`) and `;` are not necessary. – Lekensteyn Sep 15 '10 at 15:40
0

source code taken from the TCPDF library

            // download PDF as file
            if (ob_get_contents()) {
                $this->Error('Some data has already been output, can\'t send PDF file');
            }
            header('Content-Description: File Transfer');
            if (headers_sent()) {
                $this->Error('Some data has already been output to browser, can\'t send PDF file');
            }
            header('Cache-Control: public, must-revalidate, max-age=0'); // HTTP/1.1
            header('Pragma: public');
            header('Expires: Sat, 26 Jul 1997 05:00:00 GMT'); // Date in the past
            header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT');
            // force download dialog
            if (strpos(php_sapi_name(), 'cgi') === false) {
                header('Content-Type: application/force-download');
                header('Content-Type: application/octet-stream', false);
                header('Content-Type: application/download', false);
                header('Content-Type: application/pdf', false);
            } else {
                header('Content-Type: application/pdf');
            }
            // use the Content-Disposition header to supply a recommended filename
            header('Content-Disposition: attachment; filename="'.basename($name).'";');
            header('Content-Transfer-Encoding: binary');
            $this->sendOutputData($this->getBuffer(), $this->bufferlen);
            break;

anyways the most important part is

 header('Content-Disposition: attachment; filename="'.basename($name).'";');

and notice that final ; inside the string, without it, it won't work

max4ever
  • 11,909
  • 13
  • 77
  • 115