2013-05-03 41 views
0

我在CakePHP中使用tcpdf。这些PDF在Linux下可以很好地下载,但是当涉及到Opera和Safari的Mac时,它会添加.html文件。tcpdf在safari和opera中生成.html文件

我还注意到,即使它在FireFox和Google Chrome中作为PDF文档下载,弹出窗口将另存为“HTML文档”,但保存为PDF。请帮我解决一下这个。

+0

PDFs是从* Controller *还是在* View *中输出?你使用的是什么版本的CakePHP? – thaJeztah 2013-05-03 15:48:54

+0

是输出在视图内部。 Cakephp版本是2.1.5 – user2339182 2013-05-03 15:55:56

回答

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可能不知道某些文件的MIME类型,并将默认为文本/ HTML。然后你会在Safari中遇到同样的问题。这是测试一个好主意,如果你看到这样的情况,自己设定的MIME类型(在设置文件):

$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'); 

通过添加此相同的问题就解决了我。