11

コンマ区切りファイル (CSV) をダウンロードしようとしている php/mysql サイトがあります。私が作成した csv ファイルには、カンマ区切りのデータ (名前、住所、都市、州) が含まれています。csv ファイルを作成して、サイトの /downloads ディレクトリに配置します。ここまでは順調ですね。私はオンラインで探していましたが、最も頻繁に表示されるブラウザのダウンロードプロンプトをトリガーするコードは次のとおりです。

$path = $_SERVER['DOCUMENT_ROOT'];
$exportfile = "emailclientaddresses.csv";
$fullpath = "downloads/" . $exportfile;
header("Content-type: text/plain");
header("Content-Length: ".filesize($exportfile));
header("Content-Disposition: attachment; filename=" . $fullpath);

$exportfile は、私のコードが作成した csv ファイルです。大丈夫です。これが行うことは次のとおりです。

  1. $fullpath は、ブラウザーのダウンロード プロンプトに非常に奇妙な形式 (download_emailclientaddresses.csv) で表示されます。
  2. ダウンロードすると、現在の Web ページがダウンロードされるか、csv ファイルと現在の Web ページの組み合わせがダウンロードされます。

OK、私は多くのことを試しましたが、何もうまくいきませんでした。だから、誰かが私を助けることができれば、私はそれを感謝します. ありがとうございました。

エド・コーエン

4

1 に答える 1

37

PHPのドキュメントには、次のような良い例があります。

<?php
$file = 'monkey.gif';

if (file_exists($file)) {
    header('Content-Description: File Transfer');
    header('Content-Type: application/octet-stream');
    header('Content-Disposition: attachment; filename='.basename($file));
    header('Content-Transfer-Encoding: binary');
    header('Expires: 0');
    header('Cache-Control: must-revalidate');
    header('Pragma: public');
    header('Content-Length: ' . filesize($file));
    ob_clean();
    flush();
    readfile($file);
    exit;
}
?>

EDIT (コメントへの返信、説明)

header('Content-Description: File Transfer');

ブラウザには表示せず、ファイルを転送します。

header('Content-Type: application/octet-stream');
header('Content-Transfer-Encoding: binary');

ファイルはバイナリファイルです。
ブラウザは通常、表示できない場合を除いて、バイナリ ファイルをダウンロードします。

header('Content-Disposition: attachment; filename='.basename($file));

ダウンロード ダイアログに適切なファイル名が表示されるようにします。
注: 任意のファイル名を使用できます。

header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');

ファイルはブラウザによってキャッシュされるべきではありません。
動的コンテンツの場合、キャッシュが問題を引き起こす可能性があります。

header('Content-Length: ' . filesize($file));

正しいファイル サイズをブラウザに送信します。
そうしないと、ブラウザは転送時間を見積もることができません。

ob_clean();
flush();

ダウンロードを開始する前に、ヘッダーがブラウザに送信されていることを確認してください。

readfile($file);

ファイルをブラウザに送信します。

exit;

終わり :)

于 2012-07-03T17:23:05.900 に答える