我正在开发一个我正在开发的网络应用程序的奇怪问题,当我尝试从两个不同的PHP脚本下载相同的文件时,一个文件很好,另一个被MS Word检测为corrupt
两个脚本都包含完全相同的代码,一个是另一个的文字副本。
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/
。
当我从生产文件夹中的下载脚本请求文件下载时,我收到了损坏的文件。
当我从开发文件夹中的下载脚本请求相同的文件时,它很好。可能需要注意的是,文件位于生产文件夹内,生产和开发都位于文档根目录中。
以下是两个下载的请求/响应标头:
我注意到的另一件事是文件中包含的“Origin”数据之间存在差异。 (右键单击文件 - >属性 - >详细信息)
制作(损坏)
开发(未损坏)
我对可能造成这种情况的原因感到茫然,我怀疑Apache或权限......有人知道这里发生了什么吗?
编辑:该文件是生产文件夹中的现有静态文件。它不是生成的文件。
答案 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