简体   繁体   中英

PHP stream PDF with fread and readfile produce a damaged pdf

Hello guys i have a problem streaming PDF files with php, i'm using this code:

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

        }

This is my directory layout (so you can understand where the PDF are stored):

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

If i stream the a pdf from verify.php all works as intended... but if i stream the SAME PDF file from login.php they are corrupted (damaged).

Here my path definition in login.php

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

And here my path definition in verify.php

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

Obviosly path definition is before che stream code.

The average dimension of pdf files are up to 50Kb.

The file exists beacuse pass the if check but i've no clue about why in one place is ok and in the other is damaged. (i've checked the file into the directory are okay).

Sorry for my poor english and thank you in advance.

i fixed the issue editing the code like this:

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

The path work in both ways: relative or absolute.

Thanks to: readfile not working properly

Your current working derictory doesn't change depending on your included script path. So if /var/www/parent/auth/login.php is included by /var/www/parent/index.php your working directory will remain /var/www/parent .

The popular way to deal with this is to define a define('BASEPATH', dirname(__FILE__)); (BASEPATH='/var/www/parent') constant in your main file, and use it everywhere else:

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

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM