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
  • Вопрос задан
  • 165 просмотров
Пригласить эксперта
Ответы на вопрос 1
wisgest
@wisgest
Не ИТ-специалист
Подозреваю, что в таком случае может помочь нестандартный, но повсеместно поддерживаемый, HTTP-заголовок Refresh, более известный по соответствующему (http-equiv) мета-тегу. В порядке, когда сначала отдаётся HTML-документ, а потом файл, он должен работать (в этом случае можно использовать, как заголовок, так и тег). Возможно, сработает и в обратном (естественно, в этом случае можно использовать только заголовок), но когда он сработает: после начала или после окончания загрузки, — сказать не могу, сам пока не проверял.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы