bunak
@bunak
Разработчик Баз данных

[header readfile] После отдачи файла прекращается выполнение php кода. Как продолжить?

Помогите пожалуйста
Написал функцию отправки файла пользователю
//~~~~~~~~~~~~~~~~~~~~~~~~
// отправить файл от сервера к пользователю
//  $file_path - путь к файлу на сервере, который будем отправляться пользователю
//  $file_name - предложить имя, под которым файл будет записан на компьютере пользователя
//~~~~~~~~~~~~~~~~~~~~~~~~ 
function output_file($file_path='', $file_name=''){
  if (file_exists($file_path)){
    // сбрасываем буфер вывода PHP, чтобы избежать переполнения памяти выделенной под скрипт
    // если этого не сделать файл будет читаться в память полностью!
    if (ob_get_level()) {
      ob_end_clean();
    }

    // по умолчанию совпадает с именем $file_path 
    if($file_name == ''){
      $file_name = basename($file_path);
    }

    // заставляем браузер показать окно сохранения файла
    header('Content-Description: File Transfer');
    //header('Content-Type: application/octet-stream');
    header('Content-Type: '.mime_content_type($file_path));
    header('Content-Disposition: attachment; filename="'.$file_name.'"');
    header('Expires: 0');
    header('Cache-Control: must-revalidate');
    header('Pragma: public');
    header('Content-Length: ' . filesize($file_path));
    
    readfile($file_path);  // читаем файл и отправляем его пользователю
  }
}

пример отправки файла пользователю брал тут - https://www.php.net/manual/ru/function.readfile.php
После вызова этой функции output_file - php код прекращает роботу.
Комментирование exit - не решает проблему.
Проблема явно локализируется возле строчки - header('Content-Disposition: attachment; filename="'.$file_name.'"');

Север Apache на Windows, php5.6.25
  • Вопрос задан
  • 163 просмотра
Пригласить эксперта
Ответы на вопрос 1
wisgest
@wisgest
Не ИТ-специалист
Подозреваю, что в таком случае может помочь нестандартный, но повсеместно поддерживаемый, HTTP-заголовок Refresh, более известный по соответствующему (http-equiv) мета-тегу. В порядке, когда сначала отдаётся HTML-документ, а потом файл, он должен работать (в этом случае можно использовать, как заголовок, так и тег). Возможно, сработает и в обратном (естественно, в этом случае можно использовать только заголовок), но когда он сработает: после начала или после окончания загрузки, — сказать не могу, сам пока не проверял.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
YCLIENTS Москва
от 200 000 до 350 000 ₽
Ведисофт Екатеринбург
от 25 000 ₽
ИТЦ Аусферр Магнитогорск
от 100 000 до 160 000 ₽
25 апр. 2024, в 09:29
2500 руб./за проект
25 апр. 2024, в 09:27
4000 руб./за проект
25 апр. 2024, в 09:20
10000 руб./за проект