我正在尝试进行下载操作,下载使用 PHPDOCX 在“下载”控制器中生成的 Word 文档。到目前为止,PHPDOCX 能够将所需的 .docx 文件保存在正确的文件夹中,但是当我尝试下载它时出现了问题。由于媒体视图已被弃用,我必须使用 CakeResponse 文件方法,如 CakePHP 2.x Cookbook 中所建议的那样:
// In the controller:
$this->response->file($file['path'], array('download' => true, 'name' => $filename));
return $this->response;
我能够使用此方法毫无问题地导出 RTF(RTF 是使用 PHPRTFLite 生成的),但是当我使用 PHPDOCX 将该方法用于 .docx 文件时,我在 Firefox 中收到以下错误:
预扫描文件的前 1024 个字节时,未找到 HTML 文档的字符编码声明。在不同配置的浏览器中查看时,此页面将自动重新加载。编码声明需要移动到文件的前 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”视图文件当前为空白。如果您需要有关此问题的更多信息,请告诉我。
谢谢!
克里斯