如何使用 php 为 csv 文件创建下载弹出窗口(标头file_put_contents



我想知道是否有人可以给我一些关于如何创建下载弹出窗口的指示以及用户保存它的位置。

因此,当他们单击我的"下载为CSV"按钮时,它会提示用户在其目录中选择目的地。

目前,我能够让下载的文件正常工作,但前提是我从命令行运行它。我不太确定如何使用它实现标头。

主要问题是因为我不能使用 fopen((、fwrite(( 和 fclose((,因为我只向 csv 文件添加一个(尽管很大(字符串。

这里有一些代码,只有在我在本地运行程序时才有效。

$output = print_r(cleanUpEntry($info), true);
file_put_contents("output.csv", $output);

它将文件下载到与我的PHP文件完全相同的文件夹中,但是我需要它在网页上工作,以便用户可以下载该文件。

注意*我不能使用 fputcsv,因为它仅适用于数组,而我的是一个多维数组,因此获取print_r的输出要容易得多。

将CSV文件发送到浏览器

$output = ...
header('Content-Type: text/csv');
echo $output;
exit;

浏览器倾向于打开CSV,PDF等文件。要保存文件而不是打开文件,请添加 HTTP 标头Content-Disposition。对于大于几个字节的文件,也请使用Content-Length

强制浏览器下载文件。

$output = ...
$filename = "output.csv";
header('Content-Type: text/csv');
header('Content-Disposition: attachment; filename="' . $filename . '"');
header("Content-Length: " . strlen($output));
echo $output;
exit;

将静态文件发送到浏览器

你的Web服务器(Apache,Nginx等(应该处理静态文件,但如果你出于安全或其他原因需要通过PHP运行它......

$file = './files/myfile.csv';
header('Content-Type: text/csv');
readfile($file);
exit;

强制浏览器下载静态文件。

$file = './files/myfile.csv';
$filename = basename($file); // or specify directly, like 'output.csv'
header('Content-Type: text/csv');
header('Content-Disposition: attachment; filename="' . $filename . '"');
header("Content-Length: " . filesize($file));
readfile($file);
exit;

这使用老式的fopenfputcsvfclose,而不是file_put_contents,但总是对我有用...

function csv_from_array($fileName, $data, $header_included = FALSE){
// Downloads file - no return
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header('Content-Description: File Transfer');
header("Content-type: text/csv");
header("Content-Disposition: attachment; filename={$fileName}");
header("Expires: 0");
header("Pragma: public");
$fh = @fopen( 'php://output', 'w' );
foreach($data as $line) {
// Add a header row if not included
if (!$header_included) {
// Use the keys as titles
fputcsv($fh, array_keys($line));
}
fputcsv($fh, $line);
}
fclose($fh);
exit;
}

出于某种原因您需要使用file_put_contents吗?

如果文件已经存在/不需要从 php 数组创建,您可以按如下方式修改:

function download_csv($fileName){
// Downloads file - no return
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header('Content-Description: File Transfer');
header("Content-type: text/csv");
header("Content-Disposition: attachment; filename={$fileName}");
header("Expires: 0");
header("Pragma: public");
exit;
}

最新更新