Кажется, что 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;
Являются ли PDF-файлы выходными данными * контроллера * или внутри * View *? Какую версию CakePHP вы используете? – thaJeztah
Да Выходы находятся внутри самого представления. Версия CakePHP - 2.1.5 – user2339182