Вы можете намекнуть браузеру, что ваш ответ - это файл, который следует сохранить, используя заголовок Content-Disposition :
header('Content-Disposition: attachment; filename="filename.txt"');
header('Content-Type: text/plain');
echo "Desired file contents";
Обратите внимание, что это означает, что вы генерируете файл на сервере, что, как предполагает ваш вопрос, не то, что вам нужно. Вы можете создать содержимое файла в Javascript на стороне клиента, а затем создать ссылку, используя схему data uri , чтобы разрешить загрузку. Тем не менее, он поддерживается не всеми браузерами, вы не можете принудительно «сохранить как», и есть некоторые ограничения на размер того, что вы можете сгенерировать.