IE (HTTPS): генерация pdf из php файла не работает - PullRequest
11 голосов
/ 21 апреля 2009

Вот моя проблема. Я пытаюсь вызвать страницу: foo.php? DocID = bar и вернуть PDF на экран, который хранится как BLOB в БД.

Вот часть моего кода, которая на самом деле возвращает PDF:

$docID = isset($_REQUEST['docID']) ? $_REQUEST['docID'] : null;

if ($docID == null){
    die("Document ID was not given.");
}

$results = getDocumentResults($docID);

if (verifyUser($user, $results['ProductId'])){
    header('Content-type: application/pdf');
    // this is the BLOB data from the results.
    print $results[1];
}
else{
    die('You are not allowed to view this document.');
}

Это прекрасно работает в Firefox.

Однако в IE он вообще ничего не показывает. Если я нахожусь на другой странице (например, google.com) и набираю URL, чтобы перейти на эту страницу, он скажет, что все готово, но на моем экране все равно будет google.com.

Я проверил заголовки для ответов от Firefox и IE. Они идентичны.

У кого-нибудь есть предложения? Нужна дополнительная информация?

РЕДАКТИРОВАТЬ : Если это вообще поможет, вот заголовок ответа и первая строка содержимого:

HTTP/1.1 200 OK
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Content-Length: 349930
Content-Type: application/pdf
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Server: Microsoft-IIS/6.0
X-Powered-By: PHP/5.1.2
Set-Cookie: PHPSESSID=cql3n3oc13crv3r46h2q04dvq4; path=/; domain=.example.com
Content-Disposition: inline; filename='downloadedFile.pdf'
X-Powered-By: ASP.NET
Date: Tue, 21 Apr 2009 16:35:59 GMT

%PDF-1.4

РЕДАКТИРОВАТЬ : Кроме того, страница, которая извлекает файл PDF, фактически использует HTTPS вместо HTTP.

Заранее спасибо,

~ Zack

Ответы [ 6 ]

19 голосов
/ 21 апреля 2009

Я понял, в чем проблема. Это ошибка IE, связанная с IE, HTTPS и аддонами. (См. здесь )

Это была проблема с кешированием. Когда я установил:

  header("Cache-Control:  max-age=1");
  header("Pragma: public");

(см. здесь ), файл PDF находился в кеше достаточно долго, чтобы его мог загрузить дополнение Adobe Reader.

3 голосов
/ 21 апреля 2009

У меня тоже была эта проблема, я использовал следующее, которое, кажется, работает нормально

header("Content-type: application/pdf");
header("Content-Length: $length");
header("Content-Disposition: inline; filename='$filename'");
2 голосов
/ 02 июля 2011
if ( USR_BROWSER_AGENT == 'IE' ) {
    header( 'Content-Disposition: inline; filename="' . $name . '"');
    header( 'Expires: 0' );
    header( 'Cache-Control: must-revalidate, post-check=0, pre-check=0' );
    header( 'Pragma: public' );
} else {
    header( 'Content-Disposition: attachment; filename="' . $name . '"' );
    header( 'Expires: 0' );
    header( 'Pragma: no-cache' );
}
2 голосов
/ 21 апреля 2009

Попробуйте это:

 header("Content-Type: application/pdf");
 header("Content-Disposition: inline; filename=foo.pdf");
 header("Accept-Ranges: bytes");
 header("Content-Length: $len");
 header("Expires: 0");
 header("Cache-Control: private");

Также, если вы используете сеансы, вы можете попробовать установить

session_cache_limiter("none");

или

session_cache_limiter("private");
0 голосов
/ 22 марта 2011

Это был единственный заголовок, который мне нужно было изменить:

header("Pragma: public");
0 голосов
/ 21 апреля 2009

Я думаю, вам нужно добавить больше заголовков.

header("Content-Type: application/force-download");
header("Content-Type: application/octet-stream");
header("Content-Type: application/download");
header("Content-Disposition: attachment; filename=THEFILENAME.pdf;");
header("Content-Transfer-Encoding: binary");
header("Content-Length: " . strlen($results[1]));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...