带有fread和readfile的PHP流PDF会产生损坏的pdf

时间:2011-05-19 07:31:14

标签: php pdf readfile

大家好我有问题使用php传输PDF文件,我正在使用此代码:

if(file_exists($path))
        {
            //octet-stream 
            header("Content-Length: " . filesize ( $path ) ); 
            header("Content-type: application/octet-stream"); 
            header("Content-disposition: attachment; filename=".basename($path)); 
            readfile($path);

        }

这是我的目录布局(因此您可以了解PDF的存储位置):

Parent/
  verify.php
  auth/
    pdf/
    login.php

如果我从verify.php流式传输pdf,则一切按预期工作......但如果我从login.php流式传输SAME PDF文件,则会损坏(损坏)。

这是我在login.php中的路径定义

$path = "pdf/" . $filename . "_print.pdf"; 

这是我在verify.php中的路径定义

$path = "auth/pdf/" . $filename . "_print.pdf"; 

Obviosly路径定义在che stream stream之前。

pdf文件的平均尺寸高达50Kb。

该文件存在beacuse通过if检查,但我不知道为什么在一个地方是好的,另一个是损坏。 (我已经将文件检入目录了)。

抱歉我的英语很差,并提前感谢你。

2 个答案:

答案 0 :(得分:4)

我修复了编辑代码的问题:

header("Content-Length: " . filesize ( $path ) ); 
                header("Content-type: application/octet-stream"); 
                header("Content-disposition: attachment; filename=".basename($path));
                header('Expires: 0');
                header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
                ob_clean();
                flush();

                readfile($path);

路径以两种方式工作:相对或绝对。

感谢: readfile not working properly

答案 1 :(得分:0)

根据附带的脚本路径,您当前的工作难度不会改变。因此,如果/var/www/parent/auth/login.php包含/var/www/parent/index.php,您的工作目录将保持/var/www/parent

解决这个问题的流行方法是在主文件中定义define('BASEPATH', dirname(__FILE__));(BASEPATH ='/ var / www / parent')常量,并在其他地方使用它:

//in verify.php
$path = BASEPATH . "/auth/pdf/" . $filename . "_print.pdf";

//in login.php
$path = BASEPATH . "/auth/pdf/" . $filename . "_print.pdf";