2012-03-19 4 views
2

У меня есть сценарий, который ищет файл в базе данных mysql, отправляет некоторые заголовки, называет файл чем-то удобным для чтения человеком, а затем доставляет его пользователю.PHP readfile() invalid zip

Он работал около шести месяцев (для тысяч пользователей), примерно до 6 часов назад. Теперь пользователям Windows 7 появилась ошибка, в которой говорится, что «Windows не может открыть папку. Сжатая (сжатая) папка:« ... filename.zip »недействительна». Это происходит независимо от того, какой браузер загружен. Пользователи Linux и т. Д. Могут нормально открывать доставленные файлы, и, таким образом, пользователи Win7 могут иметь, скажем, WinRAR. Только Windows Explorer не может их открыть.

Вот где это становится действительно странным ... если я создаю новую копию своего скрипта и удаляю различные варианты, которые ищут файлы и решают, что назвать его, он будет загружаться и открываться просто отлично .. . Полученные файлы из обоих сценариев имеют одинаковый размер, и получившееся имя идентично. [Hardcoding новое имя в исходный скрипт не помогает. Я как бы думал, что это может быть проблема с кодировкой в ​​имени.] Я пробовал с несколькими разными zip-файлами с различным содержимым, созданным на разных машинах разными способами.

Сценарий проверяет на headers_sent(), file_exists() и is_readable().

apache_setenv('no-gzip', '1'); был добавлен в скрипты (без эффекта), следуя только полу-релевантной информации, которую я мог найти здесь или в другом месте в Интернете.

Понятно, что-то в комплекте что-то нарушает, но я не знаю, что искать ... Идеи? (В include включено около 300 строк кода ... в основном это абстрактный класс для доступа к базе данных, конкретная версия этого класса для файлов и вся их информация cms, связанные изображения для сайта и т. Д.)

По прихоти, я добавил «ob_clean(); прямо перед readfile($file); ... это исправлено. Итак, теперь мой вопрос: почему? Сообщение об ошибках отключено во всех файлах. Что еще могло отправлять выходные данные, но не заголовки ? И почему «внезапное» изменение в поведении?

+0

У вас был выход в одном из включенных файлов. Может быть, даже новая линия или пространство. – Timur

ответ

3

Major Issue

Увидели эту ошибку раньше, и мне потребовалось время, чтобы определить проблемы, потому что иногда его говорит заголовок уже послал, а иногда нет.

Вот что я узнал:

ob_clean работает, когда вы сбрасываете содержимое буфера вывода, но если вы используете ob_ get_ contents перед вызовом ob_clean вы бы видеть содержание вызывают ошибку

Для вывода этого информация убедитесь, что вы используете var_dump

Некоторые другие ошибки

Если есть space (" " or " \n" or "\t") после вызова ?> тега я часто получаю сообщения об ошибках, которые могут быть решены только путем ob_clean

Откройте ваш взгляд сценария для сценария, который имеет больше строк пустого пространства после ?> закрывающего тэга

Заключения

Я думаю, есть пустое пространство, включенное в сценарии вы не видите, и когда вы копируете его .. вы не скопировать сценарий, но не пространство, поэтому он работает в другом месте

+0

Действительно. В начале недопустимых файлов существует дополнительный разрыв строки. Все включенные файлы имеют дополнительный разрыв строки после тега?> Close ... Я исправлю новый шаблон php-файла IDE. – BriAnna

+0

Я рад, что смог помочь: D .. Попробуйте использовать Zend Studio или Latest Netbeans .. вы легко увидите эту ошибку – Baba

1

Выньте ob_clean() и откройте поврежденный файл в Wordpad или в каком-то шестнадцатеричном просмотре. Малейшие следы не двоичного вывода (включая пробелы, запятые, E_NOTICE, периоды, пыль, птица и т. Д.) ZIP.

В лучшем случае вы, вероятно, просто найдете несколько E_NOTICES (предупреждение: неопределенная константа x принята «x» и т. Д.); Если нет, хостинг, вероятно, обновил/изменил что-то.

Следующим подозреваемым будет то, что имя ускользает от меня прямо сейчас. Это когда у вас есть http://url.com/download.php?file=xxx Apache видит .php и отправляет text/php заголовок. Я не помню, как это называется, но вы исправляете его с помощью mod_rewrite.

+0

Да, в начале сломанных файлов есть дополнительный разрыв строки. – BriAnna

0

Как сказал Баба, нет пробелов ("" или "\ n" или "\ t"), и я предлагаю сохранить файл php в UTF8 без спецификации.