CSV文件没有下载PHP

时间:2016-10-17 00:25:12

标签: php csv

我正在尝试通过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();

3 个答案:

答案 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之前输出一些东西