Andreas Korthaus: (PHP)(HTTP): Excel-Datei wenn möglich im IE ausgeben

Beitrag lesen

Hallo!

Das Thema ist zwar schon älter, aber ich muss gestehen ich schaffe das einfach nicht. Mir ist bewußt dass das dann nur bei bestimmten Clients funktioniert die IE verwenden und Excel entsprechend installiert haben.

Aber es will einfach nicht funktionieren.  Wenn ich direkt eine xls-Datei verlinke, dann wird die wunderbar im Browserfenster geöffnet, wäre zwar auch eine Altermnative, aber nicht für mich da bestimmte Berechtigungen geprüft werden müssen - wobei ich momentan sogar über die Generiereung eines Verzeichnisses mit passender .htaccess die nur den aktuellen Remote-User zulässt, umd die Datei dann dahin zu kopieren.
Also, ich will die xls-Datei über ein PHP-Script ausgeben, nur schaffe ich es nicht mit header() solche HTTP-Header zu erzeugen, dass die Datei wie bei einer direkten Verlinkung  im Browserfenster angezeigt wird.

Was ich aber bekomme ist ein komisches Icon wie bei einem Bild was nicht gefunden wird. Da kann ich dann rechts draufklicken und sagen "nach Excel exportieren", und dann wird es halt in Excel geöffnet.
Ich habe den Body der HTTP-Nachricht verglichen, auf den ersten Blick sieht das 1:1 gleich aus, also bei der original-Datei und bei der generierten Datei.

so generiere ich die Datei

<?php
$excel_file = 'test.xls';
header("Content-Length: ".filesize($excel_file));
header("Content-Type: application/vnd.ms-excel");
readfile($excel_file);
?>

und ja, ich kenne http://www.dclp-faq.de/q/q-code-excel.html, aber der content-disposition Header ändert nichts am Problem, und außerdem wird sowas auch nicht bei einer verlinkten Datei erzeugt.

Hier mal die HTTP-Header:

1. direkter Aufruf der Excel-Datei im IE 6:

GET /tmp/test.xls HTTP/1.1
Host: knet-systems.de
Keep-Alive:
Connection: TE, Keep-Alive
TE: trailers

HTTP/1.1 200 OK
Date: Thu, 05 Jun 2003 07:24:35 GMT
Server: Apache/df-exts 1.1 (Unix) mod_ssl/2.8.11 OpenSSL/0.9.6e AuthPG/1.2 FrontPage/5.0.2.2510
Last-Modified: Wed, 04 Jun 2003 23:38:51 GMT
ETag: "1737df-2000-3ede830b"
Accept-Ranges: bytes
Content-Length: 8192
Keep-Alive: timeout=15, max=100
Connection: Keep-Alive
Content-Type: application/vnd.ms-excel

2. Aufruf des obigen PHP-Scriptes im IE 6:

GET /tmp/header.php HTTP/1.1
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*
Accept-Language: de
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)
Host: knet-systems.de
Connection: Keep-Alive

HTTP/1.0 200 OK
Date: Thu, 05 Jun 2003 07:23:02 GMT
Server: Apache/df-exts 1.1 (Unix) mod_ssl/2.8.11 OpenSSL/0.9.6e AuthPG/1.2 FrontPage/5.0.2.2510
X-Powered-By: PHP/4.2.3
Content-Length: 8192
Connection: close
Content-Type: application/vnd.ms-excel

Also, wo sind jetzt die Unterschiede? Bei einem Request auf eine xls-Datei erzeugt der IE einen anderen Request-Header, hier fallen vor allem

Connection: TE, Keep-Alive
TE: trailers

auf.

Beim Response kommt dann sowas:

ETag: "1737df-2000-3ede830b"
Accept-Ranges: bytes

Das fehlt bei der selbst generierten Datei. Aber auch wenn ich diese beiden Header manuell in den Response per header() einfüge ändert das nichts am Ergebnis.

Nachzuvollziehen ist das Ganze über:

direkter Link:
http://knet-systems.de/tmp/test.xls
http://forum.de.selfhtml.org/cgi-bin/http_trace.pl?url=http%3A%2F%2Fknet-systems.de%2Ftmp%2Ftest.xls&method=GET&version=HTTP%2F1.1

generierte Datei:
http://knet-systems.de/tmp/header.php
http://forum.de.selfhtml.org/cgi-bin/http_trace.pl?url=http%3A%2F%2Fknet-systems.de%2Ftmp%2Fheader.php&method=GET&version=HTTP%2F1.1

Unterschied ist auch, dass die Antwort des PHP-Scriptes in HTTP/1.0 erfolgt, und nicht 1.1, außerdem wird hier nicht keep-alive verwendet, aber daran wird es wohl kaum liegen, oder? Und nochwas, ich habe es nicht geschafft dass die Datei mit Excel geöffnet wird, im Browser wird immer openoffice verwendet, weiß jemand wo ich das ändern kann? Excel ist bereits standard-Anwendung für .xls, es könnte also auch hieran liegen.

Also ich weiß hier wirklich nicht mehr weiter. Hat denn noch jemand eine Idee was ich falsch mache oder was ich evtl. noch probieren könnte?

Viele Grüße
Andreas