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(); を置くと、readfile の後、残りのページは空白でロードされます。このページにもレポートを表示する必要があります。このページは既にヘッダー情報を送信しているため、ダウンロードされない理由にも関係があると思います。

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);

いくつかのことがあります:

  • content-typeをとして設定する必要はありませんapplication/octet-stream。もっとリアルなタイプを設定してみませんtext/plainか?
  • 日付機能をどのように使用したいかは本当にわかりません。こちらのマニュアルを参照してください:http://php.net/manual/en/function.date.php
  • @nickbによって正しく指摘されているように、実行後にスクリプトを終了する必要があります。readfile(..)
于 2012-06-15T18:23:24.840 に答える