如何在 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
)。
如果 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和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 文件
我的 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
)。
如果 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和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 文件