Создать и скачать текстовый файл с помощью 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(..)
Другие вопросы по тегам