我正在尝试使用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”视图文件目前是空白的。如果您需要有关此问题的其他信息,请与我们联系。
谢谢!
克里斯
答案 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'