Добрый день!
Прошу помощи/совета. У меня стоит стандартная задача: по нажатию кнопки на странице скрипт должен позволять скачивать автоматически генерируемый файл (xml-документ, упакованный в zip-архив). Вроде все тривиально: по нажатию формирую файл, отправляю заголовки, вывожу содержимое файла в ответ таким вот кодом:
PHP:
скопировать код в буфер обмена
$filePath = "/www/vhosts/mysite.ru/html/tmp/myfile.zip"; $fileName = "myfile.zip" header("Content-Disposition: attachment; filename=\"".$fileName."\""); header("Content-type: application/octet-stream");
Код отрабатывает, xml-документ формируется правильный, файл упаковывается и отправляется, я его сохраняю, но он оказывается "битый". Сначала я полагал, что проблема в неправильной архивации, попробовал отправлять xml-файл (с заменой значения Content-type, соответственно) в неупакованном виде - та же проблема. Файл почему-то отправляется не целиком (сгенерированный на сервере он имеет размер 27кБ, полученный в браузере 24кБ) и в начале файла добавляется "/www/vhosts/mysite.ru/html/tmp/".
Уже все перепробовал: и Content-type менять, и Content-Length убирать и функцию вывода содержимого файла другую использовать (например, fpassthru или fopen($fn, "rb")+fread) и, как уже говорил, вместо zip'а сам xml отправлять - поведение не меняется. И zip, и xml присылаются "испорченные".
Понимаю, что проблема примитивна, где-то что-то делаю не так, но поиск по Инету выдает везде практически одинаковые примеры. В чем загвоздка, не соображу.
UPD:
spartan пишет:Файл почему-то отправляется не целиком (сгенерированный на сервере он имеет размер 27кБ, полученный в браузере 24кБ) и в начале файла добавляется "/www/vhosts/mysite.ru/html/tmp/"
С первой проблемой разобрался сам... забыл flush сделать после генерации xml-документа. Осталось понять, почему в начало тела http-ответа добавляется путь к папке, где лежит файл.
UPD:
Со второй вроде тоже разобрался. Конструкция перед print'ом
решила проблему.(Отредактировано автором: 27 Апреля, 2012 - 10:40:24)
|