PHP - вывод после ob_end_flu sh () - PullRequest
0 голосов
/ 08 марта 2020

Я работаю над формой, которая создает файл CSV и затем должна отобразить ссылку для загрузки. Он работает хорошо, но не выводит сообщение об успехе из-за завершения буфера.

Файл, который генерирует файл CSV, и эхо, которое не отображается, но должно отображаться:

if(isset($_POST['createExport'])) {

    $export = new MyFlight_CreateCSV();
    $export->createCSV();

    echo "Report created!";
}

Эта проблема происходит после следующего кода из объекта MyFlight_createCSV (), который генерирует CSV-файл и нуждается в ob_end_clean () в начале и ob_end_flu sh () в конце.

ob_end_clean();

$fh = @fopen( $filename, 'w' );
fprintf( $fh, chr(0xEF) . chr(0xBB) . chr(0xBF) );
header( 'Cache-Control: must-revalidate, post-check=0, pre-check=0' );
header( 'Content-Description: File Transfer' );
header( 'Content-type: text/csv' );

fputcsv( $fh, $header_row );
foreach ( $data_rows as $data_row ) {
    fputcsv( $fh, $data_row );
}
fclose( $fh );

ob_end_flush();

Путем деактивации функции ob_end_clean (); и ob_end_flu sh (); это все еще работает, но получает предупреждение (не может изменить информацию заголовка). Чтобы продолжить выводить сообщение об успешном завершении после генерации CSV, я попробовал несколько вещей, таких как ob_start, перенаправить на другую страницу и т. Д. c. но ничего не работает и вывод остается пустым. У кого-нибудь есть идеи?

С уважением,

Лукас

1 Ответ

0 голосов
/ 08 марта 2020

Нет необходимости устанавливать заголовки HTTP, если вы записываете данные в файл, а не в вывод.

Вы должны разделить генерацию ссылки (генерацию формы) и вывод CSV на клиент, они не могут быть выполнены как в одном запросе.

Например (подача непосредственно на выход вместо создания файла):

if(isset($_GET['ExportCSV']) {
  header( 'Cache-Control: must-revalidate, post-check=0, pre-check=0' );
  header( 'Content-Description: File Transfer' );
  header( 'Content-Disposition: attachment; filename="report.csv"');
  header( 'Content-type: text/csv; charset=utf-8' );
  $fh = fopen("php://output", 'w');
  fprintf( $fh, chr(0xEF) . chr(0xBB) . chr(0xBF) );
  fputcsv($fh, $header_row);
  foreach($data_rows as $data_row) {
    fputcsv($h, $data_row);
  }
  fclose($fh);
  exit;
} else {
  // output the form with the link mentioning ExportCSV=1 in the GET parameters
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...