2012-06-15 48 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); 
} 

基本上页面刷新,但没有文件被推下载。任何人都可以指出我错过了什么吗?

编辑 我想我并不完全清楚。这不在仅创建和下载文件的页面上,而是位于也显示报告的页面上。所以当我把一个exit();读取文件后,页面的其余部分加载空白。我还需要在此页面上显示报告。我想这也可能与它不下载的原因有关,因为这个页面已经发送了标题信息。

+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