正确的PHP标头下载pdf文件

时间:2013-11-19 19:27:49

标签: php pdf header

当用户点击链接时,我真的很难让我的应用程序打开pdf。

到目前为止,锚标记重定向到发送标题为:

的页面
$filename='./pdf/jobs/pdffile.pdf;

$url_download = BASE_URL . RELATIVE_PATH . $filename;


header("Content-type:application/pdf");



header("Content-Disposition:inline;filename='$filename");

readfile("downloaded.pdf");

这似乎不起作用,有没有人过去成功地解决了这个问题?

7 个答案:

答案 0 :(得分:111)

w3schools上的示例2显示了您要实现的目标。

<?php
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");
?>

还要记住,

  

重要的是要注意必须在any之前调用header()   发送实际输出(在PHP 4及更高版本中,您可以使用输出   缓冲来解决这个问题)

答案 1 :(得分:22)

$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;

答案 2 :(得分:6)

您的代码中需要考虑一些事项。

首先,正确编写这些标题。您永远不会看到任何服务器发送Content-type:application/pdf,标头为Content-Type: application/pdf,间隔为首字母大写等。

Content-Disposition中的文件名只是文件名,而不是它的完整路径,虽然我不知道它是否是强制性的,但这个名字包含在"中{ {1}}。此外,您的上一个'也不见了。

'表示应该显示文件,而不是下载。请改用Content-Disposition: inline

此外,请将文件扩展名设为大写,以使其与某些移动设备兼容。

所有这一切,您的代码看起来应该更像这样:

attachment

<?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之前或<?php之后绝对没有任何内容,甚至不是空行。

答案 3 :(得分:3)

我最近遇到了同样的问题,这对我有所帮助:

    header('Content-Description: File Transfer'); 
    header('Content-Type: application/octet-stream'); 
    header('Content-Disposition: attachment; filename="FILENAME"'); 
    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("PATH/TO/FILE")); 
    ob_clean(); 
    flush(); 
    readfile(PATH/TO/FILE);      
    exit();

我找到了这个答案here

答案 4 :(得分:1)

你能试试吗,readfile需要完整的文件路径。

        $filename='/pdf/jobs/pdffile.pdf';            
        $url_download = BASE_URL . RELATIVE_PATH . $filename;            

        //header("Content-type:application/pdf");   
        header("Content-type: application/octet-stream");                       
        header("Content-Disposition:inline;filename='".basename($filename)."'");            
        header('Content-Length: ' . filesize($filename));
        header("Cache-control: private"); //use this to open files directly                     
        readfile($filename);

答案 5 :(得分:0)

您需要定义文件的大小......

header('Content-Length: ' . filesize($file));

这条线错了:

  

标题( “内容处置:直列;文件名='$文件名”);

你弄乱了配额。

答案 6 :(得分:0)

header("Content-type:application/pdf");

// It will be called downloaded.pdf thats mean define file name would be show

header("Content-Disposition:attachment;filename=  $fileName  ");

// The PDF source is in original.pdf

readfile($file_url);