PHP поток PDF с fread и readfile создает поврежденный PDF - PullRequest
0 голосов
/ 19 мая 2011

Здравствуйте, ребята, у меня проблема с потоковой передачей PDF-файлов с помощью php, я использую этот код:

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

Если я передаю файл pdf из verify.php, все работает как положено ... но если я передаю тот же файл PDF из login.php, они повреждены (повреждены).

Здесь мое определение пути в login.php

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

А вот мое определение пути в verify.php

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

Obviosly определение пути перед че потоковым кодом.

Средний размер PDF-файлов - до 50 КБ.

Файл существует, потому что прошел проверку if, но я понятия не имею, почему в одном месте все в порядке, а в другом повреждено. (Я проверил файл в каталоге все в порядке).

Извините за мой плохой английский и заранее спасибо.

Ответы [ 2 ]

4 голосов
/ 20 мая 2011

Я исправил проблему с редактированием кода следующим образом:

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

Путь работает в обоих направлениях: относительный или абсолютный.

Благодаря: файл чтения не работает должным образом

0 голосов
/ 19 мая 2011

Ваше текущее рабочее ограничение не меняется в зависимости от вашего включенного пути к сценарию. Таким образом, если /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";
...