【发布时间】:2019-06-24 21:18:52
【问题描述】:
我的网页有问题。我正在构建一个报告工具,用于将数据下载为 .csv - 我有一个 php 脚本,它聚合数据并从中构建一个 csv。使用exec() 命令调用脚本,详细代码如下。 skript 本身使用file_put_contents() 生成文件,然后将其存储在我的 /tmp/ 文件夹中,直到下载(我在 dockerized 环境中工作,我们的过滤器规则在下一次请求时删除文件,但我可以存储如有必要,将文件永久保存在其他地方)。然后我正在检查文件是否与file_exists() 一起存在并继续调用我的下载功能。在 Firefox 中,我得到了想要的结果,一个只有 csv 数据内容正确的文件。
我的主要问题是:当我在 Chrome 中下载 csv 时,我得到了 csv 数据,然后是我页面的 html 源代码 - 所以在 csv 数据之后的第一行中以 <!doctype html> 开头, 然后<html lang="de">在 te csv 的下一行等等..
让我给你看一些代码:
在我的脚本中:
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() 清除输出缓冲区或使用 @987654330 发送和禁用它@但对 Chrome 没有任何作用。
我也在我的下载功能中尝试过这样的事情:
header('Content-Disposition: attachment; filename="' . basename($filePath) . '"');
$fp =fopen($filePath, 'rw');
fpassthru($fp);
fclose($fp);
这在 Firefox 和 Chrome 中产生了相同的结果 - 我得到了 csv 数据,然后是 html 源代码混合到同一个文件中。
我正在使用 Symfony 框架,如果这可能来自帮助,我看到有一些用于文件下载的帮助函数,但到目前为止我无法成功使用它们..
到目前为止,我的目标只是让下载在 Chrome 中运行以拥有一个可以投入生产的工作 mvp - 它应该仅供内部使用,所以我不必关心 IE 或其他令人憎恶,因为我们的员工被告知使用普通浏览器......但是当有人看到一般概念中的缺陷时,请随时告诉我!
提前致谢:)
【问题讨论】:
标签: php google-chrome firefox http-headers output-buffering