我的网页有问题。我正在建立一个报告工具,以.csv格式下载数据-我有一个php skript,它可以汇总数据并从中构建一个CSV。 skript用exec()
命令调用,详细代码如下。 skript本身使用file_put_contents()
生成文件,然后将其存储在我的/ tmp /文件夹中,直到下载为止(我正在dockerized环境中工作,并且过滤规则会在下一个请求时删除该文件,但是我可以如果需要,将文件永久存储在其他地方)。然后,我正在检查文件中是否包含file_exists()
并继续调用我的下载功能。在Firefox中,我得到了理想的结果,即仅包含csv数据的正确内容的文件。
我的主要问题是::当我在Chrome浏览器中下载csv时,我得到的是csv数据,其后是页面的html源-因此,以<!doctype html>
开头的第一行是csv数据,然后在电视csv的下一行中依次输入<html lang="de">
,依此类推。
让我为您展示一些代码:
在我的skript中:
private function writeToFile($csv)
{
$fileName = '/path/to/file' '.csv';
echo "\n" . 'Write file to ' . $fileName . "\n";
file_put_contents($fileName, $csv);
}
在我的页面课程中:
$filePath = '/path/to/finished/csv/'
exec('php ' . $skriptPath . $skriptParams);
if (file_exists($filePath)) {
$this->downloadCsv($filePath);
} else {
$pageModel->addMessage(
new ErrorMessage('Error Text')
);
}
我在同一个类中的下载功能:
private function downloadCsv($filePath)
{
header('Content-Description: File Transfer');
header('Content-Type: text/csv');
header('Content-Disposition: attachment; filename="' . basename($filePath) . '"');
header('Content-Length: ' . filesize($filePath));
readfile($filePath);
}
上面显示的内容适用于Firefox,但不适用于Chrome。 我已经尝试使用ob_clean()
清除输出缓冲区,或使用发送并禁用它ob_end_flush()
,但不适用于Chrome。
我也在下载功能中尝试过类似的方法:
header('Content-Disposition: attachment; filename="' . basename($filePath) . '"');
$fp =fopen($filePath, 'rw');
fpassthru($fp);
fclose($fp);
这在Firefox和Chrome中产生相同的结果-我将csv数据和html源代码混合到同一文件中。
如果可以通过帮助,我正在Symfony框架内工作,我看到有一些用于文件下载的帮助程序功能,但到目前为止,我无法成功使用它们。.
直到现在,我的目标只是使下载的内容在Chrome中正常运行,从而使可以正常生产的mvp投入生产-应该只供内部使用,因此我不必关心IE或其他一些东西令人反感,因为我们的工作人员被告知要使用普通的浏览器...但是当有人看到通用概念中的缺陷时,请随时告诉我!
预先感谢:)
答案 0 :(得分:0)
所以我设法使其正常工作,但在输出缓冲区上我走错了路,但是在我的exit()
之后只需一个简单的readfile()
就足以阻止部分html最终出现在csv中文件。
代码:
private function downloadCsv($filePath)
{
header('Content-Description: File Transfer');
header('Content-Type: text/csv');
header('Content-Disposition: attachment; filename="' . basename($filePath) . '"');
header('Content-Length: ' . filesize($filePath));
readfile($filePath);
exit;
}