代码之家  ›  专栏  ›  技术社区  ›  Bruno Luiz K.

PHP输出在写入文件之前返回选项卡空间

  •  0
  • Bruno Luiz K.  · 技术社区  · 6 年前

    在这段代码中,我从header开始创建csv文件:

        $cabecalho = array(
        "RazaoSocial",
        "NomeFantasia",
        "Nome",
        "CNPJ",
        "CPF",
        "Telefone",
        "E-Mail"
    );
    $cliente = array(
        "RazaoSocial" => "1",
        "NomeFantasia" => "2",
        "Nome" => "3",
        "CNPJ" => "4",
        "CPF" => "5",
        "Telefone" => "6",
        "EMail" => "7"
    );
    
    $clientes[] = $cliente;
    /* Criando nome para o arquivo */
    $filename = sprintf('lala_%s.csv', date('Y-m-d H-i'));
    
    
    /* Definindo header de saída */
    header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
    header('Content-Description: File Transfer');
    header("Content-type: text/csv; charset=utf-8", true);
    header("Content-Disposition: attachment; filename={$filename}");
    header("Expires: 0");
    header("Pragma: public");
    
    $fp = fopen('php://output', 'w');
    
    
    fputcsv($fp, $cabecalho, ";");
    foreach ($clientes as $val){
        fputcsv($fp, $val, ";");
    }
    
    fclose($fp);
    exit();
    

    当我保存文件时,在归档的init中返回一个空格,我不知道。(img链接);

    image of archive

    有人知道吗?

    3 回复  |  直到 6 年前
        1
  •  1
  •   Steven Sesselmann    4 年前

    我也有同样的问题,我的输出文件总是以选项卡空间开始。

    我补充道,解决方案要简单得多

    ob_end_clean();
    

    标题前的代码();问题解决了。

        2
  •  0
  •   Bruno Luiz K.    6 年前

    我找到了解决方案 :

    创建一个临时文件来写入数据,创建一个新的标头,结束缓冲区,不发送请求,刷新归档文件,并在使用完之后删除临时文件:

        define("PULAR_LINHA", "\n");
    define("DELIMITAR_COLUNA", ";");
    
        function writeArchive($fileName = "archive", $cabecalho = null, $valores = null){
    
        $filename = sprintf($fileName.'_%s.csv', date('Y-m-d H-i'));
    
        $tmpName = tempnam(sys_get_temp_dir(), 'data');
        $file = fopen($tmpName, 'w');
    
        fputcsv($file, $cabecalho, DELIMITAR_COLUNA);
        foreach ($valores as $val){
            fputcsv($file, $val, DELIMITAR_COLUNA);
        }       
        fclose($file);
    
        /* Abre uma chamada especifica somente para este arquivo temp */
        header('Content-Description: File Transfer');
        header('Content-Type: text/csv');
        header('Content-Disposition: attachment; filename='.$filename.'.csv');
        ob_end_clean(); //finalizar buffer sem enviar
        header('Content-Transfer-Encoding: binary');
        header('Expires: 0');
        header('Cache-Control: must-revalidate');
        header('Pragma: public');
        header('Content-Length: ' . filesize($tmpName));
    
        ob_clean();//finalizar buffer
        flush(); //descarregar o buffer acumulado
        readfile($tmpName); //ler arquivo/enviar
        unlink($tmpName); //deletar arquivo temporario
        exit();
    }
    
        3
  •  0
  •   Krishan Kumar    4 年前

    请尝试将此csv文件保存在磁盘上,保存后,您可以直接下载此文件或重定向

    header('Location: http://www.example.com/newfile.csv');
    

    此外,在将此文件保存到磁盘时,您将发现实际问题。