2013-05-03 2 views
0

Я использую tcpdf с Cakephp. PDF-файлы загружаются хорошо в Linux, но когда дело доходит до Mac для Opera и Safari, он добавляет к нему HTML-ссылку.tcpdf генерирует .html документ в сафари и опера

Я также заметил, что даже если он загружается в виде PDF-документа в FireFox и Google Chrome, всплывающее окно сохраняет его как «HTML-документ», но сохраняет его как PDF. Пожалуйста, помогите мне с этим.

+0

Являются ли PDF-файлы выходными данными * контроллера * или внутри * View *? Какую версию CakePHP вы используете? – thaJeztah

+0

Да Выходы находятся внутри самого представления. Версия CakePHP - 2.1.5 – user2339182

ответ

1

Попробуйте изменить заголовки, как:

header("Content-Description: File Transfer"); 
header('Content-Type: application/octet-stream'); 
header('Content-Disposition: attachment; filename='.basename($file_name)); 
header('Content-Transfer-Encoding: binary'); 
header('Expires: 0'); 
header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); 
header("Cache-Control: private", false); // required for certain browsers 
header('Pragma: public'); 
header('Content-Length: ' . filesize($file_name)); 

Надеется, что это работает. :)

0

Кажется, что Mac и Safari более строги, когда речь заходит о типах mime, и всегда подчиняется типу контента, установленному в ваших сценариях. Поэтому, если для типа содержимого задано значение text/html, Safari ожидает, что он будет HTML-документом и добавит расширение html. Firefox и Chrome используют этот заголовок типа контента для представления типа файла (HTML-документ), но не изменяют имя файла, поэтому он сохраняет как PDF-файл.

Как вы используете CakePHP, это хорошая идея, чтобы использовать встроенный в ответ файл в контроллере:

$this->response->file($path,array('download' => true, 'name' => $filename)); 
return $this->response; 

Это будет правильно установить заголовки, необходимые для большинства файлов. См. Здесь для документов: http://book.cakephp.org/2.0/en/controllers/request-response.html#sending-files

Будьте предупреждены, CakePHP может не знать тип mimetype некоторых файлов и по умолчанию будет использовать текст/html. Тогда вы получите ту же проблему в Safari. Это хорошая идея, чтобы проверить, и если вы видите, что это происходит, установите типы пантомимы самостоятельно (перед установкой файла):

$ext = pathinfo($filename, PATHINFO_EXTENSION); 
switch ($ext) { 
    case 'dotx': 
     $this->response->type('application/vnd.openxmlformats-officedocument.wordprocessingml.template'); 
    break; 
} 
$this->response->file($path,array('download' => true, 'name' => $filename)); 
return $this->response; 
0

Я нашел, добавив

$this->response->type('application/pdf'); 

в файл вида и обновив последнюю версию файлов поставщиков TCPDF, она разрешила ту же проблему для нас (а также другие проблемы с отображением).

0

В контроллере просто добавить этот

$this->response->header(array('Content-type: application/pdf')); 
$this->response->type('pdf'); 

Добавив этот же вопрос решается для меня.