[gelöst] Modul für Download einer Exceldatei fügt UTF-8 BOM Bytes ein, dadurch Datei kaputt
am 10.03.2012 - 15:17 Uhr in
Zum Download von bestimmten Daten habe ich ein HTML-Formular und dazu eine PHP-Klasse erstellt, mit der eine Excel-Datei erzeugt wird die danach sofort zum Download angeboten wird.
Der Programmteil in der PHP-Klasse der den Download anstößt, sieht wie folgt aus:
<?php
if(file_exists($tmpfilename)) {
// Code dazwischen entfernt
if(file_exists($tmpfilename)) {
header('Content-Type: '.$contenttype);
header('Content-Disposition: attachment;filename="'.$filename.'"');
header('Cache-Control: max-age=0');
@readfile($tmpfilename);
@unlink($tmpfilename);
}
}
?>Der Download klappt wunderbar. Man kann die Datei entweder direkt in Excel öffnen oder auf der Platte speichern.
Nun habe ich das Formular gegen ein Drupal-Formular ausgetauscht. Im Submit-Handler wird wieder die Excel-Datei erzeugt und danach der Download angestoßen.
Der Submit-Handler in der PHP-Klasse sieht wie folgt aus.
<?php
function myform_form_submit($form, &$form_state) {
// Code dazwischen entfernt
if(file_exists($tmpfilename)) {
drupal_add_http_header('Content-Type', $contenttype);
drupal_add_http_header('Content-Disposition', 'attachment; filename="'.$filename.'"');
drupal_add_http_header('Cache-Control', 'max-age=0');
@readfile($tmpfilename);
@unlink($tmpfilename);
}
}
?>Der Download klappt. Man kann die Datei auf der Platte speichern. Das Problem ist aber, man kann sie weder beim Download noch von der Platte mit Excel öffnen. Excel gibt eine Meldung aus Die Datei 'myexcelfile.xlsx' kann von Excel nicht geöffnet werden, da das Dateiformat oder die Dateierweiterung üngültig ist. Überprüfen Sie, ob die Datei beschädigt ist und ob die Dateierweiterung dem Dateiformat entspricht.
Die temporär erzeugte Datei auf dem Server läßt sich problemlos mit Excel öffnen. Dann habe ich diese mit der heruntergeladenen Datei miteinander verglichen. Bei der Untersuchung mit einem Hexeditor habe ich festgestellt, dass die heruntergeladenen Excel-Datei ganz am Angang eine BOM Bytesequenz EF BB BF enthält. Entfernt man diese, lässt sich die Datei ebenfalls öffnen. Excel meckert zwar noch, dass es unlesbare Daten findet, repariert das aber und die Datei ist wieder wie gewohnt benutzbar.
Ich habe bereits einige Dinge ausprobiert, wie z.B. den HTTP-Header wie folgt zu ändern Alles aber ohne Erfolg
<?php
drupal_add_http_header(('Content-Type: '.$contenttype.';charset=iso-8859-1');
?>Meine Vermutung bzw. mittlerweile Überzeugung ist, dass Drupal an irgendeiner Stelle entweder die BOM Bytesequenz EF BB BF selbst ausgibt, oder den Webserver dazu bringt sie einzufügen. Ich habe aber keine Idee wo und wie das passieren könnte. Alle Veröffentlichungen die ich bereits zu dem Thema gelesen habe bringen auch keinen Hinweis der weiterhelfen könnte.
Versionen Excel-Dateiformat 2007, Drupal-Version 7.7, PHP-Version 5.3.8, Apache 2.0, lokal auf Win7 64
Ich hoffe mir kann jemand weiterhelfen, denn ich bin mit meinem Latein am Ende.
Vielen Dank im Voraus!
- Anmelden oder Registrieren um Kommentare zu schreiben

BOM-Problem
am 12.03.2012 - 11:13 Uhr
Vielleicht helfen dir die Links hier weiter: http://docs.moodle.org/19/en/UTF-8_and_BOM
Das Problem scheint öfter mal aufzutreten:
BOM-Problem
am 12.03.2012 - 18:54 Uhr
Hallo Frank Ralf,
der erste Link-Tipp war ein Volltreffer!
Vielleicht helfen dir die Links hier weiter: http://docs.moodle.org/19/en/UTF-8_and_BOM
Ich habe mit folgendem Kommando zunächste das Drupal-Root-Directory gescannt.
find . -type f -print0 | xargs -0r awk '/^\xEF\xBB\xBF/ {print FILENAME}{nextfile}'Dann habe ich Schritt für Schritt alle Subdirectories die Files mit BOM enthielten bereinigt mit
find . -type f -exec sed 's/^\xEF\xBB\xBF//' -i.bak {} \; -exec rm {}.bak \;Dazwischen habe ich jeweils probiert, ob der Download nun klappt.
Schließlich habe ich - natürlich beim letzten Directory! - herausgefunden, dass es zwei PHP-Dateien in einem schon länger zuvor installierten Modul waren.
Dieses Modul erzeugt einen kleien Teaser in einem Block, der auf jeder Seite ausgegeben wird.
Beim Download der Excel-Datei werden zwar der Teaser und auch sonstige Seiteninhalte nicht ausgeliefert, sondern nur der Header für den Download und die Datei selbst. Aber ich denke, weil Drupal immer davon ausgeht, dass es einen Standard-Node erstellen soll, inkludiert es beim Erzeugen eines Nodes alles was dafür nötig. Und somit wird auch jedesmal dieses Modul inkludiert.
Drupal macht eigentlich alles richtig und das Problem fällt nicht auf, wenn es sich um eine normale HTML-Seite handelt.
Vielen Dank nochmal!
Vielen Dank für die ausführliche Darstellung
am 13.03.2012 - 09:39 Uhr
Das war ja echte Detektivarbeit ;-)