2012-06-24 7 views
0

Я перенаправляю посетителей на своем сайте со страницы A на страницу B. На странице B я ожидаю, что пользователи получат загруженный файл PDF (который будет загружен при загрузке страницы B). я взял код из другой статьи (увидеть previous question answered here) и мой код страницы B выглядит следующим образом:Почему загруженный файл не загружается, а отображается в браузере?

<?php 
header('Content-Disposition: attachment; filename=nature.pdf'); 
header('Content-type: application/pdf'); 
$fn=fopen("/wp-content/nature.pdf","r"); 
fpassthru($fn); 
?> 

Выход не открывая диалоговое окно загрузки, а не некоторые нечитаемые символы отображаются в браузере таких, как следующее (я просто взял небольшой образец ниже):

% PDF-1.4% 3 0 объект <> поток xMK1o + $ зиг & V = T = Xo K i + # V yx3 ඀ (BX pW`

Сервер: ОС Linux; PHP версия: 5.2.17

Посетитель -> Браузер: Firefox; ОС: Windows 2000

Возможно ли провалиться из-за старой ОС на стороне клиента? Если нет, знает ли кто-нибудь решение, как заставить загрузку? Любая помощь будет высоко оценен.

Спасибо.

+0

попробуйте прочитать файл ("/ wp-content/nature.pdf"); вместо fopen & fpassthru – Venu

+0

В зависимости от размера загрузки вы можете использовать 'XSendFile' (поддерживаемый как lighttpd, так и apache2 с помощью файла modxsend). Затем вы будете загружать с помощью: 'header ('XSendFile: /wp-content/nature.pdf');' и XSendFile будут обрабатывать остальные. – user268396

+0

@Venu - уже пытался (см. Ниже при тестировании кода, предложенного пользователем «take»). Благодарю. –

ответ

1

Попробуйте с заголовком Content-Length:

ob_clean(); ob_start(); 
header('Content-Disposition: attachment; filename=nature.pdf'); 
header('Content-type: application/pdf'); 
header ("Content-Length: ".filesize("/wp-content/nature.pdf")); 
readfile("/wp-content/nature.pdf"); 
exit; 
+0

Должен ли я добавить эту строку в свой код? или заменить некоторую существующую линию? –

+0

Добавьте к вашему коду. - отредактировал мой ответ на полный пример. – take

+0

Извините, человек не работает –

0

Была причуда в очень старых браузерах, когда Content-диспозиция была первым внедряемым, некоторые из очень старых браузеров не будет показывать " Save As ", если он не может распознать тип файла, который вы пытались открыть. Попробуйте настроить Content-type на ничего (или что-то неузнаваемое) и посмотрите, заставит ли он более старый браузер открыть диалог save-as.

header('Content-type: '); 

Если это работает, то я бы предложил добавлять в строке PHP, чтобы выяснить, действительно ли вы их в старом браузере перед запуском этой линии, так как современные браузеры будут использовать этот заголовок, чтобы определить, какую программу файл должен быть открыт с помощью.

+0

Нет. Не работает. Моя версия Firefox - 12.0. Это слишком старо! Я имею в виду, что я тестирую код как клиент из этого Firefox 12.0. –

+0

из вашего объяснения, я предположил, что клиент, у которого была проблема, был в более старом браузере.Если браузер по-прежнему не загружает файл после правильного определения заголовков HTTP, это может быть просто ошибкой в ​​том, как клиент обрабатывает его. –

+0

Нет, я сказал, что старая ОС (операционная система), а не старый браузер. Итак, если вы говорите «ошибка в том, как клиент обрабатывает его», что это может быть? Включена ли она из-за старой ОС? Если это так, я, возможно, перейду к тестированию кода из более современной ОС ... Спасибо в любом случае за ваш вклад, это ценят, поскольку любой вход пытается решить мою проблему. Я благодарен. –

Смежные вопросы