使用PHP下载文件readfile()在Firefox中有效,但在Chrome中不可用

时间:2019-01-31 12:01:11

标签: php google-chrome firefox http-headers output-buffering

我的网页有问题。我正在建立一个报告工具,以.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或其他一些东西令人反感,因为我们的工作人员被告知要使用普通的浏览器...但是当有人看到通用概念中的缺陷时,请随时告诉我!

预先感谢:)

1 个答案:

答案 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;

}