我的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
)中。
如果 files
是 app'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