Создать и скачать текстовый файл с помощью php
Вот что я пытаюсь сделать. У меня есть серия отчетов, которые они также хотят загружать в виде текстовых файлов с разделителями-запятыми. Я прочитал несколько страниц, где люди говорят, что они просто выводят результаты, а не создают файл, но когда я пытаюсь это сделать, он просто выводит на страницу, на которой они находятся.
У меня есть это в форме каждого отчета
Export File<input type="checkbox" name="export" value="1" />
Так что на посту я могу проверить, если они пытаются экспортировать файл. Если они, я пытался сделать это:
if($_POST['export'] == '1')
{
$filename = date("Instructors by DOB - ".$month) . '.txt';
$content = "";
# Titlte of the CSV
$content = "Name,Address,City,State,Zip,DOB\n";
for($i=0;$i<count($instructors);$i++)
$content .= ""; //fill content
fwrite($filename, $content);
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);
}
В основном страница обновляется, но ни один файл не загружается для загрузки. Кто-нибудь может указать, что мне не хватает?
РЕДАКТИРОВАТЬ Я думаю, что я не совсем ясно. Это не на странице, которая только создает и загружает файл, это на странице, которая также отображает отчет. Поэтому, когда я ставлю выход (); после чтения файла остальная часть страницы загружается пустой. Мне нужно также отобразить отчет на этой странице. Я думаю, что это также может быть связано с тем, почему он не загружается, потому что эта страница уже отправила информацию заголовка.
1 ответ
Я упустил из виду, как вы пишете содержимое, прежде чем попросить вас попытаться закрыть файл.
Проверьте руководство fwrite здесь: http://php.net/manual/en/function.fwrite.php
Что вам нужно сделать, это:
$filename = "yourfile.txt";
#...
$f = fopen($filename, 'w');
fwrite($f, $content);
fclose($f);
и после закрытия файла, теперь вы можете безопасно отправить его для загрузки.
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);
Есть пара вещей:
- Вам действительно не нужно устанавливать тип контента как
application/octet-stream
, Почему бы не установить более реальный тип какtext/plain
? - Я действительно не понимаю, как вы хотите использовать функциональность даты. пожалуйста, обратитесь к руководству здесь: http://php.net/manual/en/function.date.php
- Как правильно указано @nickb, вы должны выйти из скрипта после выполнения
readfile(..)