Header и загрузка файла

alexvp

Новичок
Бьюсь уже второй день, пытаясь заставить корректно сохранить на компе пользователя файл с сервера.
На Opera и Chrome все работает Ок. На IE и Firefox ничего не грузится. Проверял на мобильном (Android 2.3) - файл загружается пустым
Вот какие посылаю заголовки
PHP:
header($_SERVER["SERVER_PROTOCOL"] . ' 200 OK');
header("Content-Type: application/octet-stream");
header("Content-Type: application/force-download");
header('Connection: close');
header('Content-Length: '.(filesize($file))); 
header ("Content-Disposition: attachment; filename=\"" . $file . "\""); 
echo	readfile($file);
Подскажите куда копать? И есть ли какое-нибудь вменяемое руководство по этому вопросу? Гуглил, так попадаются одни и те же копипастовские статьи, которые нисколько не помогли :(
 

alexvp

Новичок
дык из этого мана и пытался слепить. Там примеров десятки, только я искал не по readfile, а по header :) Спасибо, буду дальше копать
 

alexvp

Новичок
Перепробовал разные варианты. Результат как в самом начале. Тут меня клюнуло - а может быть дело в .htaccess? С настройками этого файла знаком поверхностно. Могут из-за него быть такие проблемы? Подскажите где там у него смотреть
 

AmdY

Пью пиво
Команда форума
тоесть этот пример не работает?
PHP:
header('Content-Description: File Transfer');
    header('Content-Type: application/octet-stream');
    header('Content-Disposition: attachment; filename='.basename($file));
    header('Content-Transfer-Encoding: binary');
    header('Expires: 0');
    header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
    header('Pragma: public');
    header('Content-Length: ' . filesize($file));
    ob_clean();
    flush();
    readfile($file);
если нет, то брось сюда какие заголовки отправляются реально. Как раз для неработающего фаерфокса есть плагин Live HTTP Headers
 

Вурдалак

Продвинутый новичок
По случайному стечению обстоятельств echo тут вряд ли создаст ошибку, но, безусловно, должен быть немедленно выпилен.

Пример дан уже по ссылке: http://php.net/manual/ru/function.readfile.php Попробуй воспроизвести его, потом можешь постепенно изменять код, приводя к варианту из первого поста. Таким образом ты сможешь понять что именно является проблемой.
 

AmdY

Пью пиво
Команда форума
Вурдалак
обожди, разве echo readfile не выплюнет кроме содержимого файла ещё и размер его, который буте воспринят как часть содержания файла?
 

Вурдалак

Продвинутый новичок
AmdY, выплюнет, но суть в том, что этот мусор появится после содержимого файла, а браузер разорвёт соединение, прочитав Content-Length байт и увидев «Connection: close». Я в этом уверен, но можешь поэкспериментировать.
 
  • Like
Реакции: AmdY

alexvp

Новичок
Нашел причину, но ситуацию пока смог устранить не полностью. Заработало в во всех браузерах, кроме мобильного. Там все равно закачивается пустой файл. Как можно поправить дело?

Причина была в следующем - после нажатия кнопки "скачать" (тип submit) в div, где она была, выводилась надпись типа "спасибо", чтобы юзер не мог дважды нажать кнопку. Помимо вывода надписи с помощью javascript, вызывался обработчик формы, который и отправлял файл юзеру. Сейчас убрал обработку onClick и IF, и Firefox стали нормально скачивать файл.
А вот мобильный браузер не хочет. Имя файла видит и сохраняет его верно, а вот сохраняет пустой файл с размером 0 байтов. Тут уж думаю причина точно в заголовках или в .htaccess.
Подскажите, плиз
 
Сверху