correct PHP headers for pdf file download correct PHP headers for pdf file download php php

correct PHP headers for pdf file download


Example 2 on w3schools shows what you are trying to achieve.

<?phpheader("Content-type:application/pdf");// It will be called downloaded.pdfheader("Content-Disposition:attachment;filename='downloaded.pdf'");// The PDF source is in original.pdfreadfile("original.pdf");?>

Also remember that,

It is important to notice that header() must be called before any actual output is sent (In PHP 4 and later, you can use output buffering to solve this problem)


$name = 'file.pdf';//file_get_contents is standard function$content = file_get_contents($name);header('Content-Type: application/pdf');header('Content-Length: '.strlen( $content ));header('Content-disposition: inline; filename="' . $name . '"');header('Cache-Control: public, must-revalidate, max-age=0');header('Pragma: public');header('Expires: Sat, 26 Jul 1997 05:00:00 GMT');header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT');echo $content;


There are some things to be considered in your code.

First, write those headers correctly. You will never see any server sending Content-type:application/pdf, the header is Content-Type: application/pdf, spaced, with capitalized first letters etc.

The file name in Content-Disposition is the file name only, not the full path to it, and altrough I don't know if its mandatory or not, this name comes wrapped in " not '. Also, your last ' is missing.

Content-Disposition: inline implies the file should be displayed, not downloaded. Use attachment instead.

In addition, make the file extension in upper case to make it compatible with some mobile devices. (Update: Pretty sure only Blackberries had this problem, but the world moved on from those so this may be no longer a concern)

All that being said, your code should look more like this:

<?php    $filename = './pdf/jobs/pdffile.pdf';    $fileinfo = pathinfo($filename);    $sendname = $fileinfo['filename'] . '.' . strtoupper($fileinfo['extension']);    header('Content-Type: application/pdf');    header("Content-Disposition: attachment; filename=\"$sendname\"");    header('Content-Length: ' . filesize($filename));    readfile($filename);

Content-Length is optional but is also important if you want the user to be able to keep track of the download progress and detect if the download was interrupted. But when using it you have to make sure you won't be send anything along with the file data. Make sure there is absolutely nothing before <?php or after ?>, not even an empty line.