如何在 CakePHP 中下载一个 csv 文件

How to download a csv file in CakePHP

我的 webroot/files 中有一个 csv 文件。每当我单击 link 时,我都希望下载该 csv 文件。我已经编写了以下代码,文件也正在下载,但下载的内容中没有内容 file.so 请帮助下载包含所有内容的 csv 文件。

这是我的代码:

public function downloadSamplefile()
{
    $name= "abc format.csv";    

    $file_path=HTTP_ROOT."app\webroot\files".$name;
    header('Content-Description: File Transfer');
    header('Content-Type: application/force-download');
    header("Content-Disposition: attachment; filename=\"" . basename($name) . "\";");
    header('Content-Transfer-Encoding: binary');
    header('Expires: 0');
    header('Cache-Control: must-revalidate');
    header('Pragma: public');
    header('Content-Length: ' . filesize($name));
    $file = @fopen($file_path);
    ob_clean();
    flush();
    readfile(HTTP_ROOT."app\webroot\files".$name); 

    @fclose($file);
    exit;

}

我认为问题出在路径上(var $file_path)。

如果 filesapp\webroot\里面的一个文件夹那么$file_path变量就是

$file_path=ROOT."app\webroot\files\".$name; // \ is also needed after 'file'
  //double \ coz of escape char, try with single / also as follows
$file_path=ROOT."app/webroot/files/".$name;
  // best way to use cake php's functionality
$file_path=WWW_ROOT."files".DS.$name;

更改readfile和filesize函数参数也:

readfile($file_path);
header('Content-Length: ' . filesize($file_path));

删除 以下两行作为@steve 的评论:

$file = @fopen($file_path);
@fclose($file);

因为readfile函数本身会自动打开然后关闭文件。


如果不行 那么也试试:

$name="abc%20format.csv"; //space is encoded as %20 in URLs

光看说明书怎么样? There is a whole page dedicated to how to send files. 还有复制和粘贴现成的代码,展示了如何正确执行此操作。

此外,如果您的文件在 public 可访问、未受保护的 webroot 中可用,则通过 php 推送文件也没有意义。直接 link 文件即可。

按照以下步骤操作

第一步

在你的控制器中创建一个方法

public function downloadSamplefile() {
  $this->viewClass = 'Media';
  // Download app/webroot/files/example.csv
  $params = array(
     'id'        => 'example.csv',
     'name'      => 'example',
     'extension' => 'csv',
     'download'  => true,
     'path'      => APP . 'webroot' . DS. 'files'. DS  // file path
 );
 $this->set($params);
}

第 2 步

转到你的 ctp 文件并写一个 link 就像

echo $this->Html->link(
'Download Sample',
array(
    'controller' => 'dashboards', // controller name
    'action' => 'downloadSamplefile',  //action name
    'full_base' => true
));

您将在视图文件

中看到下载样本 link

当您点击 下载示例 link 时,它将下载一个存储在您的 app/webroot/files/exampl.csv

中的 csv 文件

参考linkcakephp.org documentation