отправка pdf

Alkinoy

Начинающий
отправка pdf

Пытаюсь отправить браузеру pdf-ку, вот код
PHP:
    $path_parts = pathinfo($fname);
    $fp = fopen($fname, 'rb');
    header("Content-Type: application/pdf");
    header("Content-Length: " . filesize($fname));
    fpassthru($fp);
    flush();
браузер открывает пустой лист. Хидеры отсылаются, если поменть content-type на text/plain в браузере имеем исходны текст pdf-ки... не могу понять причину...
 

Alkinoy

Начинающий
Автор оригинала: Gas
Может флаг - rb ?
сорри, как раз rb и стоит...

-~{}~ 17.01.08 13:26:

проблема решилась добавлением еще одного хидера
header("Accept-Ranges: bytes");

-~{}~ 17.01.08 13:31:

однако, блин... решилась только в ИЕ... в опере не открывает.... блин.
 

Gas

может по одной?
Alkinoy
у меня твой скрипт работает нормально в IE6, FF 2.0.0.11 и Opera 9.24, без всяких Accept-Ranges
 

Alkinoy

Начинающий
Автор оригинала: Gas
Alkinoy
у меня твой скрипт работает нормально в IE6, FF 2.0.0.11 и Opera 9.24, без всяких Accept-Ranges
разница между простой отдачей файла напрямую самим апачем и отдачей скриптом только в этих занчениях хидеров:

Date: Thu, 17 Jan 2008 12:14:02 GMT
Server: Apache/2.2.6 (Win32)
X-Powered-By: Zend Core/2.5.0 PHP/5.2.4
Set-Cookie: PHPSESSID=jthpnb0jun7q4dlluojkjgait7; path=/
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache

Last-Modified: Tue, 21 Dec 2004 13:19:04 GMT
Accept-Ranges: bytes
Content-Length: 146977
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: application/pdf

красным - это то, что есть при прямой отправке, но нет при отправке скриптом, полужирным - то, что есть при отправке скриптом и нет при прямой отправке... вот и все различие...

-~{}~ 27.02.08 12:14:

реанимирую тему, потому как проблема вернулась...
файл отдается таким скриптом:
PHP:
if (is_file($name)) {
    $path_parts = pathinfo($name);
    $fp = fopen($name, 'rb');
    header("Content-Type: ".get_content_type($path_parts['extension']));
    header("Content-Length: " . filesize($name));
    fpassthru($fp);
    flush();
    exit;
} else {
    header("HTTP/1.1 404 Not Found");
    echo '<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>404 Not Found</title>
</head><body>
<h1>Not Found</h1>
<p>The requested URL '.$_SERVER["QUERY_STRING"].' was not found on this server.</p>
</body></html>';

}
function get_content_type($ext) {
    $types = array("pdf" => "application/pdf",
        "doc" => "application/msword",
        "rtf" => "text/rtf",
        "txt" => "text/plain");
    if (array_key_exists($ext, $types)) {
        return $types[$ext];
    }
    return "text/html";
}
в ИЭ все работает прекрасно. под оперой сам файл грузится (идет прогресс-бар загрузки документа), но после загрузки - не отображается... Если же документ отдается не скриптом, а Апачем - все пучком...

вот заголовки при передаче документа скриптом:
HTTP/1.1 200 OK
Date: Wed, 27 Feb 2008 10:15:21 GMT
Server: Apache/2.0.50 (FreeBSD) mod_ssl/2.0.50 OpenSSL/0.9.7d PHP/4.3.8
X-Powered-By: PHP/4.3.8
Set-Cookie: PHPSESSID=6d83db1562a4d65b48fb2a0584119a69; path=/
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Content-Length: 85160
Keep-Alive: timeout=15, max=99
Connection: Keep-Alive
Content-Type: application/pdf


вот заголовки при передаче документа самим апачем:
HTTP/1.1 200 OK
Date: Wed, 27 Feb 2008 10:20:00 GMT
Server: Apache/2.0.50 (FreeBSD) mod_ssl/2.0.50 OpenSSL/0.9.7d PHP/4.3.8
Last-Modified: Wed, 27 Feb 2008 10:18:17 GMT
ETag: "7be43-1701e-1fa14c40"
Accept-Ranges: bytes
Content-Length: 94238
Keep-Alive: timeout=15, max=100
Connection: Keep-Alive
Content-Type: application/pdf
 

Alkinoy

Начинающий
этих заголовков нет. в обоих случаях.

-~{}~ 27.02.08 19:39:

и разве Content-Disposition используется не для случая сохранения файла? тут надо в броузере открыть....

-~{}~ 27.02.08 19:41:

дальше смотрю - это корректно?

Content-Transfer-Encoding: Метод кодирования, используемый в письме, согласно стандарту MIME.

Если да, то причем тут это к данному случаю?
 

dimagolov

Новичок
Alkinoy
у броузеров какой нативное кодирование данных? текстовое или бинарное?
а про Content-Disposition это к тому, чтобы броузер не генерил имя получаемого файла со справочника стеля, а писал то, что получил.
 

dimagolov

Новичок
проверил... Opera 9.10, IE 6 и 7, FF 2 и 3 открывает что с наличием заголовков Content-Disposition и Content-Transfer-Encoding, что без них. более того, оставил только Content-Type: application/pdf и Content-Length и все открывается в окошке броузера.

п.с. проверяй символы после ?>
 

Alkinoy

Начинающий
Автор оригинала: dimagolov
Alkinoy
не тупи... exit имменно php скрипт завершит, а не обработку файла
Да???? а что говорит опыт?
Опыт 1:
код:
PHP:
<?php
echo "Татарам даром дам!!!! \n"; 
?>

Да ты что!!!!!!!
=======================
Вывод:
PHP:
Татарам даром дам!!!! 

Да ты что!!!!!!!
=======================

Опыт 2:
код:
PHP:
<?php
echo "Татарам даром дам!!!! \n"; 
exit();
?>

Да ты что!!!!!!!
=======================
вывод:
PHP:
Татарам даром дам!!!!
 

dimagolov

Новичок
написал потом сделал аналогичный тест :)

добавлю, что файлы отдаю не через fpassthru, а readfile_chunked из каментов к readfile
 

Alkinoy

Начинающий
проверял на разных машинах (клиентах), на 2-х серверах, на разных РНР (4 и 5).
по поводу readfile_chunked - ща проверим....
 
Сверху