2012-06-15 2 views
3

Вот что я пытаюсь сделать. У меня есть серия отчетов, которые также хотят иметь возможность загружать в виде текстовых файлов с разделителями-запятыми. Я прочитал кучу страниц, где люди говорят, что просто отгоняют результаты, а не создают файл, но когда я пытаюсь, он просто выводит на страницу, на которой они находятся.Создайте и скачайте текстовый файл с помощью 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); 
} 

В основном страница обновляется, но файл не загружается для загрузки. Может ли кто-нибудь указать, что мне не хватает?

EDIT Я думаю, что я был не совсем ясен. Это не на странице, которая только создает и загружает файл, это на странице, которая также отображает отчет. Поэтому, когда я устанавливаю exit(); после файла read остальная страница загружается пустым. Мне также нужно отобразить отчет на этой странице. Я думаю, что это также может иметь отношение к тому, почему он не загружается, потому что эта страница уже отправила информацию заголовка.

+1

Попробуйте закрыть файл после того, как выписывать ему .. Значит ли это помощь? – SuperSaiyan

+0

Создан ли файл? Кроме того, вы должны выйти из скрипта после 'readfile()'. – nickb

+0

Почему бы просто не создать ссылку на загружаемый контент на той же странице, что и на дисплее? Таким образом, они могут беспрепятственно просматривать отчет и выбирать, хотят ли они загрузить его, а не сначала решить, хотите ли они загрузить его, прежде чем просматривать его. Проактивный или реактивный. Это решит проблему с заголовками. – aowie1

ответ

8

Я забыл, как вы пишете содержимое, прежде чем попросить вас закрыть файл.

Проверить 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(..)
+0

Я добавил дополнительную информацию, чтобы уточнить мой вопрос. – Jhorra