PDF文件下载的正确PHP头文件

0vvn1miw  于 2023-01-08  发布在  PHP
关注(0)|答案(7)|浏览(148)

我真的很难让我的应用程序在用户点击链接时打开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");

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

btqmn9zl

btqmn9zl1#

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

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

5jvtdoz2

5jvtdoz22#

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

iq0todco3#

在您的代码中需要考虑一些事情。
首先,正确地写那些头,你永远不会看到任何服务器发送Content-type:application/pdf,头是Content-Type: application/pdf,有空格,第一个字母大写等等。
Content-Disposition中的文件名只是文件名,而不是它的完整路径,尽管我不知道它是否是强制性的,但这个名称是用" Package 的,而不是'
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之前或?>之后绝对没有任何内容,甚至没有空行。

zzlelutf

zzlelutf4#

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

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

iklwldmw

iklwldmw5#

你能试试这个吗,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);
zrfyljdw

zrfyljdw6#

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

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

而这句话是错的:
header(“内容处置:内联;文件名=“$文件名”);
你搞砸了配额。

klsxnrf1

klsxnrf17#

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

相关问题