Мое PHP-приложение должно предоставлять моим пользователям одну кнопку, при нажатии которой:
- Выполняет функцию, которая генерирует файл .csv и сохраняет его на сервере.
- Загружает этот файл в клиент пользователя.
- Повторно отображает ту же страницу, на которой находится кнопка.
Для лучшего, что я сделал до сих пор, требуются две кнопки. К вашему сведению, они выглядят так:
Кнопка «Создать файл экспорта» выдает POST, который выполняет функцию генератора файлов. HTML-код для этого:
<form enctype="multipart/form-data" action="season.php?#19" method="POST" name="export_meals_form">
<input type="hidden" name="export_meals" value="docs/meals.csv">
<p><input type="submit" value="Generate Export File" />
</form>
Кнопка «Загрузить файл экспорта» на самом деле является ссылкой. Вот код HTML:
<p><a href="docs/meals.csv" download><button type="button">Download Export File</button></a></p>
Если пользователь нажимает эти две кнопки в правильном порядке, все работает нормально. Но нет никаких причин, по которым пользователь должен сделать два клика (и, возможно, ошибиться);эти два действия всегда должны происходить вместе и в таком порядке.
Мне кажется, проблема в том, что я не знаю, как начать загрузку из кода PHP. Единственный способ загрузки, который я нашел, состоит в том, чтобы пользователь щелкнул ссылку с модификатором «download», как указано выше.
Несколько других задали этот вопрос, и обычный ответ выглядит так:использовать функцию PHP readfile (), встроенную в такой код (из Как загрузить файл из базы данных / папки с помощью php ):
header('Content-Description: File Transfer');
header('Content-Type: application/force-download');
header("Content-Disposition: attachment; filename=\"" . basename($name) . "\";");
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . filesize($name));
ob_clean();
flush();
readfile("your_file_path/".$name); //showing the path to the server where the file is to be download
exit;
Когда я вызываю такой кодиз функции PHP я получаю сообщение о том, что заголовки не могут быть загружены, поскольку они уже отправлены. Если я вставлю код в, он просто отобразит содержимое файла в моем браузере и не отобразит страницу.
Я думаю, что здесь есть что-то базовое, чего я не понимаю.