0

我正在尝试进行下载操作,下载使用 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”视图文件当前为空白。如果您需要有关此问题的更多信息,请告诉我。

谢谢!

克里斯

4

2 回答 2

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

于 2013-02-07T21:20:10.430 回答
0

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

'docx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'
于 2016-09-05T20:28:53.300 回答