【发布时间】:2013-05-13 14:08:12
【问题描述】:
我在 Windows Server 2012 上使用 PHP 和 IIS 8。我在服务器上创建了一个 UTF-8 编码文件,然后使用以下代码将其推送到客户端:
// Start upload to client
$fullPath = $full_name;
$fsize = filesize($fullPath);
$path_parts = pathinfo($fullPath);
$ext = strtolower($path_parts["extension"]);
header("Content-type: application/octet-stream");
header("Content-Disposition: attachment; filename=\"".$file_name."\"");
header("Content-length: $fsize");
header("Cache-control: private");
readfile($full_name);
当客户端收到文件时,它包含一个起始 BOM 并且(哦,令人惊讶)文件末尾缺少 3 个字符。我已经检查了服务器上的文件,它被正确保存在那里(没有保存 BOM 并且三个丢失的字符在那里)。
创建和上传文件的 PHP 脚本有标题
header('Content-Type:text/html; charset=UTF-8');
我已经在文件末尾添加了 3 次“换行符”来获取三个缺失的字符。我也可以为变量 $fsize 添加 +3,但我觉得做这种作弊不太舒服(它可能会反击)。我认为应该有一个更优雅的方法来解决这个问题。
奇怪的是,我在装有 IIS 7.5 的 Win7 机器上使用了相同的代码,并且添加 UTF-8 BOM 没有问题。 PHP目录是Win7机器上目录的副本,包括php.ini文件。
有人能看到我错过了什么吗?
提前感谢您的帮助。
【问题讨论】:
-
不要以
application/octet-stream发送文本。以文本形式发送。 -
最后 3 个字符被删除,因为您发送了正确的 Content-Length 标头(没有 bom)& 浏览器在到达它后会剪切所有内容。
-
谢谢马特,这是合理的,因为我只是发送文本。我刚刚更改了我的代码,但仍在添加 BOM。
-
谢谢 pozs,这就是我的想法,这就是为什么我在文件末尾添加三个额外的“换行符”:只是为了获取三个缺失的字符。我正在寻找比这更优雅的解决方案。