如何在 CakePHP 中下载 csv 文件


How to download a csv file in CakePHP

我的webroot/files中有一个csv文件。每当我点击一个链接时,我希望下载该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;
}

简单地阅读手册怎么样?有一整页专门介绍如何发送文件。还有复制和粘贴就绪代码,显示了如何正确执行此操作。

此外,如果文件在公共可访问的、不受保护的 Webroot 中可用,则通过 php 推送文件也没有意义。只需直接链接文件即可。

按照以下步骤操作

步骤-1

在控制器中创建一个方法

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文件并编写一个链接,如下所示

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

您将在视图文件中看到"下载示例"链接

当您单击下载示例链接时,它将下载一个存储在您的应用程序/webroot/files/exampl中的csv文件.csv

参考链接 cakephp.org 文档

我认为问题出在路径(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($file_path);
header('Content-Length: ' . filesize($file_path));

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

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

因为读取文件功能本身打开然后自动关闭文件。


如果不起作用,则也尝试使用:

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