2017-07-05 5 views
0

Ich erstelle eine sehr große Tabelle in einer einzigen Zeichenfolge $ Ausgabe mit den Daten aus einer MySQL-Datenbank. In Ende des PHP-Skript, ich sende zwei Header:PHP senden 0 Bytes Excel-Datei durch Echo

header("Content-type: application/msexcel"); 
header("Content-Disposition: attachment; filename=action.xls"); 

Das Problem ist, wenn der große Tisch über mehr als 55000 Zeilen. Wenn dies geschieht, ist die gesendete Datei 0 Bytes und der Benutzer öffnet eine leere Datei. Ich sende die Datei durch diese nach den Headern:

echo $output; 

Wenn die Tabelle nicht zu viele Zeilen hat, die Datei gesendet Arbeit. Wie sende ich eine Datei so, dass die Größe der Ausgabe $ string nicht von Bedeutung ist?

+0

Sie erscheinen nicht eine gültige xls-Datei zu machen. Ihr Header sollte den Dateityp * actual * widerspiegeln. – rtfm

+0

Dieses Skript druckt auch andere Dateien, und ich habe die Anzahl der Register auf weniger als 55000 zum Testen geändert und das Skript hat die Datei korrekt gesendet. Wenn die Register zu groß werden, wird die Datei nicht gesendet. Ich habe eine Datei in das Dateisystem erstellt und überprüft, dass die Datei 10 MB hat. –

Antwort

1
header("Content-type: application/msexcel"); 
header("Content-Disposition: attachment; filename=action.xls"); 

bewegen sich diese Linien nach oben der Seite oder Script, bevor HTML-Tabelle wird es beginnt

+0

Nicht funktioniert. Da ich bis "echo $ output;" nichts in den Browser drucke, hat sich durch das Verschieben dieser Header an den Anfang der Seite nichts geändert. –

0

Die Lösung in einer anderen Frage gefunden arbeiten gearbeitet dafür. Die Datei ist zu groß zum Senden, daher wird die Lösung Stück für Stück an den Benutzer gesendet. Statt Verwendung ReadFile-() Funktion verwenden, um die readfile_chuncked() angepasst Funktion:

define('CHUNK_SIZE', 1024*1024); // Size (in bytes) of tiles chunk 

// Read a file and display its content chunk by chunk 
function readfile_chunked($filename, $retbytes = TRUE) { 
    $buffer = ''; 
    $cnt = 0; 
    $handle = fopen($filename, 'rb'); 
    if ($handle === false) { 
     return false; 
    } 

    while (!feof($handle)) { 
     $buffer = fread($handle, CHUNK_SIZE); 
     echo $buffer; 
     ob_flush(); 
     flush(); 

     if ($retbytes) { 
      $cnt += strlen($buffer); 
     } 
    } 

    $status = fclose($handle); 

    if ($retbytes && $status) { 
     return $cnt; // return num. bytes delivered like readfile() does. 
    } 
    return $status; 
}