Вот что я пытаюсь сделать. У меня есть серия отчетов, которые также хотят иметь возможность загружать в виде текстовых файлов с разделителями-запятыми. Я прочитал кучу страниц, где люди говорят, что просто отгоняют результаты, а не создают файл, но когда я пытаюсь, он просто выводит на страницу, на которой они находятся.
У меня есть это в виде каждого отчета
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); }
В основном страница обновляется, но файл не загружается для загрузки. Может ли кто-нибудь указать, что мне не хватает?
EDIT Я думаю, что я был не совсем ясен. Это не на странице, которая только создает и загружает файл, это на странице, которая также отображает отчет. Поэтому, когда я устанавливаю exit (); после файла read остальная страница загружается пустым. Мне также нужно отобразить отчет на этой странице. Я думаю, что это также может иметь отношение к тому, почему он не загружается, потому что эта страница уже отправила информацию заголовка.
Я забыл, как вы пишете содержимое, прежде чем просить вас попробовать закрыть файл.
Проверьте руководство по 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
? readfile(..)