Отправьте файл CSV пользователю в форме отправки FAPI
У меня есть форма FAPI, которая собирает некоторую информацию от пользователя, а затем генерирует CSV-файл. Цель состоит в том, чтобы, когда пользователь нажимает "экспорт" в форме, CSV загружается сразу.
Однако, когда обработчик отправки вызывает функцию, генерирующую CSV, форма просто перенаправляет, а не обслуживает CSV.
Есть ли какой-либо способ заставить эту форму обслуживать CSV напрямую пользователю, не создавая временный файл?
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);
Следующая процедура "отправит" файл пользователю, в результате чего браузер откроет диалоговое окно "сохранить файл":
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 обрабатывает безопасные загрузки.