Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Не могу заставить скрипт возвращать браузеру корректный файл для загрузки

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
spartan
Отправлено: 27 Апреля, 2012 - 09:10:44
Post Id


Новичок


Покинул форум
Сообщений всего: 1
Дата рег-ции: Апр. 2012  


Помог: 0 раз(а)




Добрый день!

Прошу помощи/совета. У меня стоит стандартная задача: по нажатию кнопки на странице скрипт должен позволять скачивать автоматически генерируемый файл (xml-документ, упакованный в zip-архив). Вроде все тривиально: по нажатию формирую файл, отправляю заголовки, вывожу содержимое файла в ответ таким вот кодом:

PHP:
скопировать код в буфер обмена
  1.  
  2. $filePath = "/www/vhosts/mysite.ru/html/tmp/myfile.zip";
  3. $fileName = "myfile.zip"
  4. header("HTTP/1.1 200 OK");
  5. header("Content-Disposition: attachment; filename=\"".$fileName."\"");
  6. header("Content-Length: ".filesize($filePath));
  7. header("Content-type: application/octet-stream");
  8. print file_get_contents($filePath);
  9.  


Код отрабатывает, 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)

 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Работа с файловой системой и файлами »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB