从不同的PHP脚本下载时,MS Word文件损坏

时间:2016-12-22 19:49:28

标签: php apache ms-word php-7

我正在开发一个我正在开发的网络应用程序的奇怪问题,当我尝试从两个不同的PHP脚本下载相同的文件时,一个文件很好,另一个被MS Word检测为corrupt

enter image description here

两个脚本都包含完全相同的代码,一个是另一个的文字副本。

ob_start();

header('Content-Description: File Transfer');
header("Content-Type: $contentType");
header('Content-Disposition: attachment; filename='.basename($file));
header('Content-Length: ' . filesize($file));
ob_clean();

readfile($file);
exit;

我正在使用运行Apache 2.4和PHP7的Windows Server 2012。我分别使用两个不同的文件夹进行生产和开发/app//appBeta/

当我从生产文件夹中的下载脚本请求文件下载时,我收到了损坏的文件。

当我从开发文件夹中的下载脚本请求相同的文件时,它很好。可能需要注意的是,文件位于生产文件夹内,生产和开发都位于文档根目录中。

以下是两个下载的请求/响应标头:

制作(损坏) enter image description here 开发(不是腐败) enter image description here

我注意到的另一件事是文件中包含的“Origin”数据之间存在差异。 (右键单击文件 - >属性 - >详细信息)

制作(损坏)

enter image description here

开发(未损坏)

enter image description here

我对可能造成这种情况的原因感到茫然,我怀疑Apache或权限......有人知道这里发生了什么吗?

编辑:该文件是生产文件夹中的现有静态文件。它不是生成的文件。

1 个答案:

答案 0 :(得分:0)

我在word doc生成器上遇到了类似的问题。事实证明问题是混合编码。管理通过ForceUTF8库提供所有内容来标准化编码问题来解决问题:

use \ForceUTF8\Encoding;

$output = Encoding::toUTF8($raw_input); //where $raw_input is your unsanitized source data

结果$output然后呈现为功能词doc。在您的情况下,如果文件是预先存在的静态文件(原始问题中未提及),您可能也会遇到响应标头定义的编码问题。

您需要在项目中包含ForceUTF8库才能使用它,请在此处查看其github页面以获取设置说明: https://github.com/neitanod/forceutf8