PHP 脚本下载 php 文件本身而不是给定的文件

问题描述

我已经问过这个问题,但不正确,而且我不知道,我无法执行 html 页面并在同一页面上开始下载,但现在我知道了。主要问题实际上仍然存在,我无法下载 CSV 文件,它总是获取 PHP 自身。代码被执行。我在 PHP.ini 中没有找到任何关于 CSV 的信息。我在下载之前直接创建了文件(在另一个页面中),所以不可能,它不存在。

<?PHP
if(empty($_POST['checkBox_put_it_in_CSV_too'])!=1){
  $file=fopen('created_files/Rankrohad_P_2021-04-01.csv','w');
  $filename='created_files/Rankrohad_P_2021-04-01.csv';
  foreach($rankrohad as $line){
    fputcsv($file,$line,"|","'");
  }
  fclose($file);
  $fsize=filesize($filename);
    if(file_exists($filename)){
    header('Content-Description: File Transfer');
    header('Content-Type: application/csv');
    header('Content_disposition: attachment; filename="'.$filename.'"');
    header('Expires: 0');
    header('Cache-Control: must-revalidate');
    header('Pragma: no-cache');
    header('Content-Length: '.$fsize);
    readfile($filename);
    exit;
  }
}
?>

解决方法

问题出在您的标题上。试试这个:

if(file_exists($filename)){
    $fsize=filesize($filename);
    header('Content-Description: File Transfer');
    header('Content-Type: application/csv');
    header("Content-Disposition: attachment; filename=\"$filename\"");
    header('Expires: 0');
    header('Cache-Control: must-revalidate');
    header('Pragma: no-cache');
    header('Content-Length: '.$fsize);
    readfile($filename);
    exit;
}

在 Content-Disposition 标题中,我对文件名进行了转义,并将文件大小函数放在 IF 中。