我正在尝试通过php导出和下载csv文件。我完全按照Export to CSV via PHP
的建议完成了我可以在响应中看到我的数组转储,但csv文件只是没有下载。请帮助。
这是我的代码:
function download_send_headers($filename) {
// disable caching
$now = gmdate("D, d M Y H:i:s");
header("Expires: Tue, 03 Jul 2001 06:00:00 GMT");
header("Cache-Control: max-age=0, no-cache, must-revalidate, proxy-revalidate");
header("Last-Modified: {$now} GMT");
// force download
Header('Content-Description: File Transfer');
header("Content-Type: application/force-download");
// header("Content-Type: application/octet-stream");
// header("Content-Type: application/download");
// disposition / encoding on response body
header("Content-Disposition: attachment;filename={$filename}");
header("Content-Transfer-Encoding: binary");
}
function array2csv(array &$array)
{
// if (count($array) == 0) {
// return null;
// }
ob_start();
$df = fopen("php://output", 'w');
fputcsv($df, array_keys(reset($array)));
foreach ($array as $row) {
fputcsv($df, $row);
}
fclose($df);
return ob_get_clean();
}
以下是我如何使用它:
download_send_headers("data_export_" . date("Y-m-d") . ".csv");
echo array2csv($modsucc);
die();
答案 0 :(得分:1)
这是javascript函数:
function exporttocsv(filter){
var fd = new FormData();
fd.append('filter', filter);
fd.append("form", "export_to_csv");
$.ajax({
url: getBaseURL()+'assets/handler/OrderManagementHandler.php',
type: 'POST',
data: fd,
enctype: 'multipart/form-data',
processData: false,
contentType: false,
})
.done(function(res) {
})
.fail(function() {
});
}
处理程序:
case 'export_to_csv':
$controller->exportToCSV($_POST);
break;
控制器:
public function exportToCSV($data){
$filter = $data['filter'];
$mod = new OrderManagementModel();
$modsucc = $mod->exportToCSV($filter);
if($modsucc){
// var_dump(ini_get('output_buffering'));
//var_dump($modsucc);
download_send_headers("data_export_" . date("Y-m-d") . ".csv");
echo array2csv($modsucc);
die();
}
}
答案 1 :(得分:1)
您的代码不起作用,因为您使用ajax并且您无法使用ajax本身下载文件,简单的方法是:
...
if($modsucc){
$file = /* directory */"data_export_" . date("Y-m-d") . ".csv";
$df = fopen(file, 'w');
fputcsv($df, array_keys(reset($array)));
foreach ($array as $row) {
fputcsv($df, $row);
}
fclose($df);
echo $file;
}
...
这将保存文件,并在你的ajax完成功能中:
window.open(res);
这将打开一个新窗口,其中包含以前保存的文件或
的地址window.location.href = res;
这会将您重定向到保存文件的地址
强制下载你可以这样做:
//force-download.php
if(file_exists($_GET['file'])){
download_send_headers("data_export_" . date("Y-m-d") . ".csv");
echo file_get_contents($_GET['file']); // warning: unsafe !! session for example will be better
}
这将发送强制下载标题并从磁盘中读取数据,其中数据已被预先保存并回显它们
并在你的ajax完成功能中:
window.open('force-download.php?file=' + res);
或
window.location.href = 'force-download.php?file=' + res;
这个使用地址将发送强制下载标题
另一种可能性是,将$_POST
更改为$_GET
,而不是使用ajax只重定向到网址,它将与您的旧代码一起使用
答案 2 :(得分:0)
你的代码工作,只考虑可能出错的是你的服务器没有启用输出缓冲并在调用函数download_send_headers
之前输出一些东西