2012-03-19 57 views
2

我有一个查找在MySQL数据库中的文件,发出一些头,名字的文件的东西可读的,然后脚本提供了它的用户。PHP ReadFile的()无效拉链

这是工作半年左右(为成千上万的用户),直到大约6小时前。 现在,Windows 7用户现在得到一个错误,指出“Windows无法打开文件夹。压缩(压缩)文件夹:'... filename.zip'无效。”无论浏览器用于下载,都会发生这种情况Linux用户等可以很好地打开交付的文件,Win7用户也可以,比如WinRAR。只有Windows资源管理器无法打开它们。

这里是它变得非常奇怪的地方...如果我制作了我的脚本的新副本,并删除各种包括查找文件并决定如何命名它,它会下载并打开就好.. 。来自两个脚本的结果文件大小相同,结果名称相同。 [将新名称硬编码到原始脚本中并没有帮助。我觉得这可能是一个编码问题的名称。]我已经尝试过用不同的方法在不同的机器上创建不同内容的zip文件。

脚本检查headers_sent(),file_exists(),和is_readable()。

apache_setenv('no-gzip', '1');加入以下唯一的半相关的信息,我可以在这里找到或在互联网上的其他地方的脚本(无效果)。

显然,一些在包括以某种方式打破的东西,但我没有任何想法要寻找什么...想法? (包含大约300行代码......基本上,它是数据库访问的抽象类,文件的所有类的具体版本以及它们的所有cms信息,该站点的相关图像等)。

在一时兴起,我在readfile($file);之前加上了“ob_clean(); ......它修正了它。所以我现在的问题是:为什么?所有文件中的错误报告都是关闭的。还有什么可以发送输出但不是头文件?而为什么“突然”在behaivor

+0

您在一个包含的文件中有一些输出。甚至可能是换行符或空格。 – Timur 2012-03-19 07:17:13

回答

3

主要问题

见过这个错误之前,把我的时间来识别问题,因为有时它表示头部已经发送,有时没有。

这里是我发现:

ob_clean作品时,你丢弃输出缓冲区的内容,但如果你调用ob_clean之前使用ob_ get_ contents你将看到的内容造成错误

输出这些信息确保您使用var_dump

一些其他错误

如果有space (" " or " \n" or "\t")调用?>标签我经常收到错误只能由ob_clean

解决打开你的脚本找脚本,有空闲空间?>结束标记

结论后,多行后

我认为这是在脚本中包括一个空的空间,你没有看到,当你把它复制..你不是复制脚本,但不是空间,这就是为什么它的工作原理别处

+0

确实。在无效文件的开始处有一个额外的换行符。所有包含的文件在?> close标签后都有一个额外的换行符......我将修复我的IDE的新php文件模板。 – BriAnna 2012-03-19 07:31:01

+0

很高兴我能够帮助:D ..尝试使用Zend Studio或最新的Netbeans ..你会很容易看到这个错误 – Baba 2012-03-19 07:34:04

1

变化取出ob_clean();而在写字板中打开损坏的文件或某些十六进制查看器的非二进制输出的丝毫痕迹(包括空格,逗号。 E_NOTICEs,时期,灰尘,鸟粪等)将削弱 压缩。

在最好的情况,你可能就发现一些E_NOTICES(警告:假设的“x”等不确定的常数X);如果不是,托管可能升级/改变了一些东西。

下一个犯罪嫌疑人就是那个名字,这个名字现在无法回避。这是当你有http://url.com/download.php?file=xxx阿帕奇看到.php并发送text/php标题。我不记得那是什么,但你用mod_rewrite修复它。

+0

是的,在破损文件的开头处有一个额外的换行符。 – BriAnna 2012-03-19 07:30:18

0

像巴巴说,没有空格(“”或“\ n”或“\ t”),我建议将php文件保存为UTF8 而没有BOM