【问题标题】:PHP output returning a tab space before write filePHP输出在写入文件之前返回一个制表符空间
【发布时间】:2018-05-04 12:54:12
【问题描述】:

在这段代码中,我从 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 中返回一个空格,我不知道。 (图片链接);

image of archive

有人知道吗?

【问题讨论】:

  • 您的 PHP 文件在开始 <?php 之前或某些包含文件中是否包含任何空格或制表符?
  • 是一个广泛的项目,在代码中有很多包含和使用。该代码用于导出客户列表表。已经向我指出了同样的事情,但我在那花了 3 个小时试图找到这里是 之前的空格
  • 有办法在 之前删除空格
  • 是的,找到并编辑有这些空格的文件;)或者不要使用php://output
  • 我会试着找到那个kkk。有办法用 php://output 创建一个新的静态文件吗?

标签: php output archive fputcsv


【解决方案1】:

我遇到了同样的问题,我的输出文件总是以制表符开头。

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

ob_end_clean();

header() 之前的代码;问题就解决了。

【讨论】:

    【解决方案2】:

    我找到了解决办法

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

        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】:

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

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

      在您将这个文件保存到磁盘时,您也会发现实际问题。

      【讨论】:

      • 我需要使用上面描述的答案,因为代码太旧并且使用了很多不同的 IDE,并且很难找到所有的空行或空格。然后我创建了上面的函数从头开始创建一个新的 csv 文件。
      猜你喜欢
      • 1970-01-01
      • 2012-06-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-15
      • 2017-11-12
      相关资源
      最近更新 更多