Как на php генерировать файл?

Есть php файл, который отображает:
input "$name"
input "$title"
textarea "$text"
button

Как сделать, что бы при нажатии на кнопку начал скачиваться файл $name.html
с содержимым:
<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8" />
	<title>$title</title>
</head>
<body>
<h1>$title<h1>
<p>$text</p>
</body>
</html>


$name, $title, $text - это данные вводимые на php страничке пользователем.
В идеальном варианте - сгенерированный файл только начинает скачиваться и всё - на сервере не остаётся.
Заранее спасибо
  • Вопрос задан
  • 3091 просмотр
Решения вопроса 1
BoShurik
@BoShurik
Symfony developer
Создавать файл не надо. Достаточно что-то вроде этого:
<?php
$name = 'name';
$title = 'title';
$text = 'text';

$body = <<<BODY
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title>$title</title>
</head>
<body>
<h1>$title<h1>
    <p>$text</p>
</body>
</html>
BODY;


header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename=' . sprintf('%s.html', $name));
header('Content-Length: ' . sizeof($body));

echo $body;
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@myLizzarD
PHP developer
Все что вам нужно сделать:
1) в Вашем шаблоне-файле в место $title и $text ставите, например, {{title}}, {{text}}.
2) в месте, куда приходят данные формы, т.е. Ваши переменные, вы заменяете текст вот так
$filename = "$name.html"
$fileText = file_get_contents($filename);
$newFileText = str_replace("{{title}}", $title, $fileText);
$newFileText = str_replace("{{text}}", $text, $fileText);
file_put_contents(newFileText, $newFilename)

что-то вроде шаблонизатора. Теперь ваш файл содержит данные, введенные пользователем, все что осталось - отправить их
3) отправляете файл одним из указанных в статье способов способы.
4) если хотите отдать только 1 раз, то вам нужен такой способ
$filename = "$name.html"
    $fileText = file_get_contents($filename);
    $newFileText = str_replace("{{title}}", $title, $fileText);
    $newFileText = str_replace("{{text}}", $text, $fileText);
    if (ob_get_level()) {
        ob_end_clean();
    }
    // заставляем браузер показать окно сохранения файла
    header('Content-Description: File Transfer');
    header('Content-Type: application/octet-stream');
    header('Content-Disposition: attachment; filename=' . basename($file));
    header('Content-Transfer-Encoding: binary');
    header('Expires: 0');
    header('Cache-Control: must-revalidate');
    header('Pragma: public');
    header('Content-Length: ' . filesize($file));
    echo $newFileText;
    exit;


Код написан с целью показать способ и не претендует на универсальность.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы