PHP создает файл для загрузки без сохранения на сервере

Конечная цель: я хочу создать веб-страницу, на которой пользователь может вводить информацию в формы. С этой информацией я хочу создать html-файл (ниже называемый test-download.html), вставив информацию, указанную в шаблон, а затем принудительно загрузить. Поскольку я хочу продемонстрировать это на предстоящем семинаре, где люди будут использовать это «в одно и то же время», я хотел бы не сохранять файл на сервере, а просто принудительно загрузить его.

Пока: у меня есть это в моем html-файле (test.html):

<form action="test.php" method="post">
To file: <input type="text" name="tofile" />
<input type="submit" />
</form>

и это в моем test.php:

<?php
$filename = 'test-download.html';
$htmlcode1 = "<HTML> \n <BODY>";
$htmlcode2 = "</BODY> \n <HTML>";
$somecontent = $htmlcode1.$_POST["tofile"].$htmlcode2;
!$handle = fopen($filename, 'w');
fwrite($handle, $somecontent);
fclose($handle);


header("Cache-Control: public");
header("Content-Description: File Transfer");
header("Content-Length: ". filesize("$filename").";");
header("Content-Disposition: attachment; filename=$filename");
header("Content-Type: application/octet-stream; "); 
header("Content-Transfer-Encoding: binary");

readfile($filename);

?>

Это перезаписывает файл test-download.html и вызывает принудительную загрузку.

Вопрос: Как мне это сделать, не возясь с файлом (test-download.html) на сервере?


person Thomas    schedule 06.04.2011    source источник


Ответы (2)


Вместо того, чтобы сохранять его в файл, просто echo скопируйте его после отправки заголовков.

person alex    schedule 06.04.2011
comment
@Thomas Да, сделайте это после заголовков и удалите сохранение и чтение из кода файла. - person alex; 06.04.2011
comment
Я только что попробовал это, и это, кажется, работает! Немного ничего себе опыт там. Еще раз спасибо. - person Thomas; 06.04.2011
comment
@arrowill12 В моем ответе единственный кодecho, я не знаю, как это можно исправить. - person alex; 08.12.2012
comment
Спасибо за это Томас и Алекс. Я также изменил Content-Length, чтобы отразить размер строки содержимого, поскольку файла больше нет :), т.е. header(Content-Length: .strlen($somecontent).;); - person Ryan H.; 24.12.2014

Поймите, что почти каждый раз, когда PHP-скрипт отвечает на запрос, он «генерирует файл», который загружается браузером. Все, что вы echo, print, printf или иным образом выводите на стандартный вывод, является содержимым этого «файла».

Все, что вам нужно сделать, это сообщить браузеру, что «файл» должен обрабатываться по-другому, и заголовки, которые вы выводите, уже должны это делать. После отправки заголовков все, что вы распечатываете, становится содержимым загрузки.

person cHao    schedule 06.04.2011
comment
Спасибо за объяснение. Я не знал, что файл можно не сохранять, а просто передать для скачивания. - person Thomas; 06.04.2011
comment
@Thomas: Да, это немного сногсшибательно, когда вы впервые это осознаете. Но браузер в основном просто говорит GET /some/url и возвращает кучу байтов (ответ) и некоторые метаданные (заголовки). Он не знает и не заботится о том, как они были сгенерированы, или где они были сохранены, или действительно, были ли они сохранены где-нибудь вообще. - person cHao; 06.04.2011
comment
@cHao My Mind + Ваша информация = Взорван! - person usumoio; 13.06.2013