На клиенте отсутствует заголовок Content-Disposition - PullRequest
1 голос
/ 22 июня 2010

У меня есть php add, который вызывает LaTeX, а затем передает PDF в браузер. Поскольку мои пользователи будут платить за эту услугу, я хочу убедиться, что им предоставлена ​​возможность сохранить PDF, а не снова и снова попадать на мой сервер.

exec("cd tex && latex {$_SESSION['sen_id']}.tex && pdflatex {$_SESSION['sen_id']}.tex", $output);
$pdf = substr($file,0,-3).'pdf';
if (file_exists($pdf)) {
  //header('Content-Description: File Transfer');
  header('Content-Type: application/pdf');
  //header('Content-Length: ' . filesize($pdf));
  header('Content-Disposition: attachment;filename='.date('Ymd-His').'-'.basename($pdf));
  header('Content-Transfer-Encoding: binary');
  header('Expires: 0');
  header('Cache-Control: no-cache');
  header('Pragma: no-cache');
  ob_clean();
  flush();
  readfile($pdf);
  exit;
} else {
  echo '<h1>No PDF Produced</h1>';
  echo nl2br(print_r($output,true));
}

Используя Wireshark, я заметил, что заголовок Content-Disposition либо не установлен, либо не достигает клиента.

HTTP/1.1 200 OK\r\n
Date: Tue, 22 Jun 2010 14:15:10 GMT\r\n
Server: Apache/2.0.55 (Ubuntu) mod_jk/1.2.14 mod_python/3.1.4 Python/2.4.3 PHP/5.1.2 mod_ssl/2.0.55 OpenSSL/0.9.8a mod_perl/2.0.2 Perl/v5.8.7\r\n
X-Powered-By: PHP/5.1.2\r\n
Set-Cookie: SESS0d6c65b0599f5b70f6bbc50cfc5b2f94=2b23ba1f74f5f1f641365e9fbb45870d; expires=Thu, 15 Jul 2010 17:48:30 GMT; path=/; domain=.<domain removed>\r\n
Content-Transfer-Encoding: binary\r\n
Expires: 0\r\n
Cache-Control: no-cache\r\n
Pragma: no-cache\r\n
Connection: close\r\n
Transfer-Encoding: chunked\r\n
Content-Type: application/pdf\r\n
\r\n

Пока что советы, которые я нашел, говорят: «используйте octet-steam», «не используйте octet-stream», «ставьте пробелы после двоеточий», «пишите с заглавной буквы каждое слово» и «заключайте имя файла в кавычки» ». Я полагаю, что людям, которым повезло, много дезинформации.

1 Ответ

1 голос
/ 22 июня 2010

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

В этих случаях я остановился на решении, которое написал на странице руководства PHP здесь (см. Первый пример).

В вашем случае вы используете недопустимый заголовок, который, однако, должен работать со всеми основными браузерами.

...