在CakePHP中下载docx文件

时间:2013-02-07 20:43:44

标签: php cakephp docx

我正在尝试使用PHPDOCX下载在“下载”控制器中生成的Word文档的下载操作。到目前为止,PHPDOCX能够将所需的.docx文件保存在正确的文件夹中,但是当我尝试下载它时会出现问题。由于不赞成使用Media Views,我必须使用CakePHP 2.x Cookbook中建议的CakeResponse文件方法:

// In the controller:
$this->response->file($file['path'], array('download' => true, 'name' => $filename));
return $this->response;

我能够使用此方法导出RTF没有问题(RTF是使用PHPRTFLite生成的),但是当我使用PHPDOCX将该方法用于.docx文件时,我在Firefox中收到以下错误:

  

找不到HTML文档的字符编码声明   当预扫描文件的前1024个字节时。在观看时   配置不同的浏览器,此页面将自动重新加载。   需要将编码声明移动到前1024个范围内   文件的字节。

我想使用接受HTML的文档生成器,这就是我选择PHPDOCX的原因。考虑到上述错误,我开始使用以下方法定义标头和内容类型:

$this->response->header(array('Content-type'=>'application/vnd.openxmlformats-officedocument.wordprocessingml.document'));

但我仍然在CakePHP中收到同样的错误:

  

找不到请求的文件APP / files / info_sheets / filename.docx

我想到的一件事是,PHPDOCX在生成文档时会发送许多错误,这会干扰Mime类型或编码。但根据2.x Cookbook:

  

调用CakeResponse::header()时也不会发送标头。   它们只是缓冲,直到实际发送响应。

另一个想法是我需要在内容类型之后的标题中设置字符编码:

$this->response->header(array('Content-type'=>'application/vnd.openxmlformats-officedocument.wordprocessingml.document;charset=utf-8'));

但这会导致文字乱码。

有没有人有任何想法如何解决这个问题? “download.ctp”视图文件目前是空白的。如果您需要有关此问题的其他信息,请与我们联系。

谢谢!

克里斯

2 个答案:

答案 0 :(得分:1)

首先,您可能会尝试禁用autoRender,否则CakePHP可能仍会尝试渲染您的视图和布局;

$this->autoRender = false;

另外,还没有测试过,但是你试过这个来设置标题:

// register the type 
$this->response->type(array('docx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'));
// set the type for the response
$this->response->type('docx');

参见文档: http://book.cakephp.org/2.0/en/controllers/request-response.html#dealing-with-content-types

答案 1 :(得分:0)

您可以修改框架核心中的media.php文件,并将mime-type添加到具有类型的数组中。 例如:

'docx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'
相关问题