Отправьте файл CSV пользователю в форме отправки FAPI


У меня есть форма FAPI, которая собирает некоторую информацию от пользователя, а затем генерирует CSV-файл. Цель состоит в том, чтобы, когда пользователь нажимает "экспорт" в форме, CSV загружается сразу.

Однако, когда обработчик отправки вызывает функцию, генерирующую CSV, форма просто перенаправляет, а не обслуживает CSV.

Есть ли какой-либо способ заставить эту форму обслуживать CSV напрямую пользователю, не создавая временный файл?

 4
Author: Chris Cohen, 2011-03-21

2 answers

Я предполагаю, что код в этом сообщении в блоге http://sirkitree.net/node/23 поможет. По сути, вам нужно использовать exit() или die() в конце вашего обработчика отправки, чтобы предотвратить перенаправление.

  $file = $header ."\n";
  foreach ($accounts as $row) {
    $file .= $row ."\n";
  }
  header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
  header('Content-Type: text/csv');
  header('Content-Disposition: attachment; filename="users.csv"');
  die(print $file);
  
 6
Author: Sivaji, 2011-03-21 16:52:31

Следующая процедура "отправит" файл пользователю, в результате чего браузер откроет диалоговое окно "сохранить файл":

function _cex_download( $output, $filename ) 
{
  header("Pragma: public");
  header("Expires: 0");
  header("Cache-Control: private");
  header("Content-type: application/octet-stream");
  header("Content-Disposition: attachment; filename=$filename");
  header("Accept-Ranges: bytes");
  echo $output;
  exit;
} 

(Где "cex" - это имя моего пользовательского модуля, а "_cex" обозначает закрытую функцию.)

Чтобы использовать это, сгенерируйте свой CSV-файл внутри строки, а затем просто вызовите его, передав содержимое CSV в $output и имя файла, которое браузер сохранит в $filename.

Изначально я понял эту логику из того, как Ubercart обрабатывает безопасные загрузки.

 2
Author: Blake Senftner, 2011-03-24 02:04:45