php强制下载修改文件

php强制下载修改文件,php,download,web,Php,Download,Web,我正在使用php强制下载我正在制作的Web服务的.bz2归档文件和.deb文件,但下载后这些文件无效。我在一个文本编辑器中打开了原始文件和通过php下载的文件,我注意到用php下载的文件在文件的开头有1个额外的空间,在删除该空间后,文件确实工作了。这可能是什么原因造成的 以下是我正在使用的代码: header('Content-Type: package/x-generic'); header('Content-Length: ' . filesize($file)); ob_clean();

我正在使用php强制下载我正在制作的Web服务的.bz2归档文件和.deb文件,但下载后这些文件无效。我在一个文本编辑器中打开了原始文件和通过php下载的文件,我注意到用php下载的文件在文件的开头有1个额外的空间,在删除该空间后,文件确实工作了。这可能是什么原因造成的

以下是我正在使用的代码:

header('Content-Type: package/x-generic');
header('Content-Length: ' . filesize($file));
ob_clean();
ob_flush();
readfile($file);
exit;
我已经尝试过使用不同的头以及clean和flush函数


如果您有任何帮助或想法,我们将不胜感激。

在一些php文件中的
?>
之后,您可能会有额外的空间。通常,最好省略关闭标记
?>
以避免此问题


如果是这种情况,您可以使用after
flush()
来了解额外空间来自哪个文件/行。

可能是因为您的PHP文件保存为UTF-8,带有BOM()。尝试将您的php文件保存为UTF-8,而不使用BOM表。任何合理的高级文本编辑器都允许您将文件保存为UTF-8,而无需BOM表


还要注意与此相关的另一个问题。它还提到了可能导致问题的原因。

如果php标记前面有空格,则可能会导致开头出现空格。如果需要输出缓冲(ob_clean(),ob_flush()),则在设置标头之前,可能有一个空间或数据在某处获得输出。如果可能的话,关闭输出缓冲,您会得到一个错误,告诉您输出是从哪一行开始的。

我终于找到了问题的解决方案,经过长时间的搜索,我发现我在php文件中包含了另一个php文件,该文件在?>标记后面有一个空格:感谢所有回答

或在退出后放置/*的人:-)额外的字节出现在下载文件的开头,因此问题来自以前包含的文件。OP的文件中只有一个额外的字节,BOM不是不止一个字节吗?@arnaud576875:嗯,不错;我相信事实上是的。@arnaud576875:虽然我提到的维基百科文章中说了这一点,但它应该被解释为零宽度的不间断空间。也就是说,当在其他地方遇到BOM标记时,根据Unicode,它应该被视为零宽度非中断空间。我可以想象这仍然会被一些文本编辑器视为一个空字符,然后。BOM是2或3个字节。0xFE,0xFF表示UTF-16。UTF-8的0xEF、0xBB、0xBF(虽然UTF-8没有字节顺序,所以BOM基本上是无用的)。如果额外空间是由过早输出造成的,则使用前缀
error\u reporting(E\u ALL)
获取信息性消息。也可以是hexeditor或二进制差异。