【问题标题】:CSV file not downloading PHPCSV 文件未下载 PHP
【发布时间】:2016-10-17 00:25:12
【问题描述】:

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

【问题讨论】:

  • 发布您的代码。
  • 远程调试已经够难的了,但是当我们看不到代码的时候就几乎不可能了
  • 我已添加代码..请查看
  • 检查您的输出缓冲是否“开启”。请检查:ini_get('output_buffering');更多详情请查看:stackoverflow.com/questions/5608975/…
  • 输出缓冲已启用,我已经检查过了。它是否取决于输出缓冲的缓冲区大小?..目前它的默认值是 4kb

标签: php csv


【解决方案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();
    }
}

【讨论】:

    【解决方案2】:

    您的代码不起作用,因为您使用 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 done 函数中:

    window.open('force-download.php?file=' + res);
    

    window.location.href = 'force-download.php?file=' + res;
    

    此使用地址将发送强制下载标头

    另一种可能性是,将$_POST 更改为$_GET,而不是使用 ajax,只需重定向到 url,它将适用于您的旧代码

    【讨论】:

    • 非常感谢..你是一个救生员..我是网络编程的新手..今天学到了很多..再次感谢..
    【解决方案3】:

    您的代码可以工作,只认为可能是您的服务器没有启用输出缓冲并且您​​在调用函数download_send_headers之前输出了一些东西

    【讨论】:

    • 输出缓冲已启用
    • 它是否取决于输出缓冲的缓冲区大小?..目前它的默认值是 4kb
    • @Sanidhya 是的,如果达到限制,输出将被刷新,您无法再设置标题。在任何文本之前尽快发送标题。
    • 好的..但是每次都会设置标题。我可以在网络响应标头中看到它。是否有可能由于缓冲区大小较小,无法保存 csv 数据并被刷新?
    • 当缓冲区已满时,数据被发送到客户端,缓冲区清空,准备再次保存下一个数据,所以没有... 内容类型:application/force-download 未知,浏览器将处理此内容类型为application/octet-stream,比如application/whatever-new-type,目前未知
    猜你喜欢
    • 2015-06-04
    • 2014-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-21
    • 1970-01-01
    • 1970-01-01
    • 2022-01-09
    相关资源
    最近更新 更多