M
M
Mikhailo2021-02-04 17:22:52
PHP
Mikhailo, 2021-02-04 17:22:52

[header readfile] After uploading the file, php code execution stops. How to continue?

Please help
Wrote a function to send a file to a user

//~~~~~~~~~~~~~~~~~~~~~~~~
// отправить файл от сервера к пользователю
//  $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);  // читаем файл и отправляем его пользователю
  }
}

I took an example of sending a file to the user here - https://www.php.net/manual/ru/function.readfile.php
After calling this function output_file - php code stops the robot.
Commenting exit - does not solve the problem.
The problem is clearly localized near the line - header('Content-Disposition: attachment; filename="'.$file_name.'"');

Apache server on Windows, php5.6.25

Answer the question

In order to leave comments, you need to log in

1 answer(s)
W
wisgest, 2021-02-14
@wisgest

I suspect that the non-standard, but widely supported, HTTP header Refresh, better known by the corresponding ( http-equiv) meta tag, can help in this case. It's OK to give the HTML document first and then the file, it should work (in this case, both the title and the tag can be used). Perhaps it will work in the opposite way (of course, in this case only the header can be used), but when it works: after the start or after the download is completed, I can’t say, I haven’t checked it myself yet.

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question