3

这就是我想要做的。我有一系列报告,他们也希望能够以逗号分隔的文本文件的形式下载。我已经阅读了很多页面,人们说只是简单地回显结果而不是创建文件,但是当我尝试它只是输出到他们所在的页面时。

我在每份报告中都有这个

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(); 在读取文件之后,页面的其余部分加载为空白。我还需要在此页面上显示报告。我认为这也可能与为什么它不下载有关,因为这个页面已经发送了标题信息。

4

1 回答 1

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(..)
于 2012-06-15T18:23:24.840 回答