2011-08-23 148 views
1

我正在使用php来强制下载.bz2压缩文件和.deb文件,以便我正在制作web服务,但下载后文件无效。我在文本编辑器中打开了原始文件和通过php下载的文件,我注意到,使用php下载的那个文件在文件开始处有一个额外的空间,在删除文件的工作空间后。什么可能导致这个?php强制下载修改文件

这里是我使用的代码:

header('Content-Type: package/x-generic'); 
header('Content-Length: ' . filesize($file)); 
ob_clean(); 
ob_flush(); 
readfile($file); 
exit; 

我已经试着用不同的页眉和清洁冲洗功能试验。

任何帮助或想法将不胜感激。

+0

前缀'error_reporting(E_ALL)'获得一条信息性消息,如果额外空间是由于提前输出引起的。也hexeditor,或二进制差异。 – mario

回答

0

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

如果是这种情况,您可以在flush()之后使用headers_sent()来知道多余的空间来自哪个文件/行。

+0

或在出口后面加上'/ *':-) – Neal

+0

额外的字节出现在下载文件的开头,所以问题来自于之前包含的文件。 – arnaud576875

0

可能是因为您的PHP文件以BOM(Byte Order Mark)保存为UTF-8。尝试将您的php文件保存为没有BOM的UTF-8。任何合理先进的文本编辑器都可以让您将文件保存为不带BOM的UTF-8。

另请参阅my answer另一个与此相关的问题。它还提到了arnaud576875谈到的问题是可能的原因。

+0

OP在他的文件中只有一个extrat字节,是不是BOM多于一个字节? – arnaud576875

+0

@ arnaud576875:嗯,是的,好点;我相信这是真的,是的。 –

+0

@ arnaud576875:虽然我提到的维基百科文章说,它应该被解释为零宽度的非破坏性空间。 http://en.wikipedia.org/wiki/Zero-width_non-breaking_space还说,当在其他地方遇到BOM标记时,根据Unicode,它应该被视为零宽度的非破坏空间。我可以想象,这仍然会被一些文本编辑器当作单个空字符处理。 –

0

如果你在php标签之前有空白,可能会导致开始的空间。如果需要输出缓冲(ob_clean(),ob_flush()),则可能在设置标题之前有空间或数据获取输出。如果可能,请关闭输出缓冲,并且您应该得到一个错误,告诉输出开始的行。

-1

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