Dateiendung 10. June 2004 um 00:00 Uhr /
Ich wollte für ein kleines CMS für einen Kunden der Einfachheit halber die Dateiendungen bei hochgeladenen Bildern weglassen. Dabei kam mir der Gedanke dass vielleicht nicht alle Browser dan was damit anfangen können. Vor allem hat mir der IE sorgen bereitet.
Also habe ich mich aufgemacht und habe etwas im Internet rumgeschaut ob ich Informationen darüber finden kann. Folgendes habe ich zugesteckt bekommen:
Any HTTP/1.0 message containing an entity body should include a Content-Type header field defining the media type of that body. If and only if the media type is not given by a content-Type header, as is the case for Simple-Response messages, the recipient may attempt to guess the media type via inspection of its content and/or the name extension(s) of the URL used to identify the resource. If the media type remains unknown, the recipient should treat it as type "application/octet-stream".
Das ist gut, dachte ich mir, aber halten sich denn auch alle Browser daran? Ganz hinten in meinem Gehirn machte sich noch der Gedanke bemerkbar dass der Internet Explorer der Fa. Microsoft wie so oft auch da sein eigenes Spielchen spielt. Irgendwas sagte mir dass ich da noch einmal nachhaken.
Nach drei Stunden Suche habe ich es aufgegeben und bin zum Testen übergegangen.
Das Ergebnis
In allen getesteten Browsern gab es keine Probleme. Und hier noch eine Liste mit Welchen Browsern ich getestet habe:
Windows
- IE 3 + 4 + 5 + 6
- AOL 7.0
- Netscape 4.78 + 4.8 + 6.2 + 7.0
- Mozilla 1.5
- Firefox 0.8
- Opera 7.11 + 7.23
Mac
- Safari 1.2
- Explorer 5.2
- Mozilla 1.6
- Netscape 7.0
- Opera 6.0
Linux
- Netscape 4.8 + 7.0
- Mozilla 1.6
- Firefox 0.8
- Opera 7.51
- Konqueror 3.2.2 + 3.0.5
- Amaya 8.5
Wenn jemand noch lust zum testen hat hier eine Testseite, wenn man das Bild sieht ist alles in Ordnung wenn nicht dann schnell hier melden. Ich würde mich freuen wenn ihr euere Ergebnise auch hier gebündelt veröffentlichen würdet.
Kommentare
Die Kommentare sind für diesen Eintrag geschlossen.
Kronn aus Berlin schrieb am 10.06.2004
Opera 7.5/Windows 2000 geht auch. (Große Überraschung :-) )
Außerdem gibt es noch einen tollen Artikel drüben bei SitePoint.com:
http://www.sitepoint.com/article/effective-website-acceleration/2
Gruß!
Matthias
wahsaga schrieb am 11.06.2004
> Das ist gut, dachte ich mir, aber halten sich denn auch alle Browser daran?
die frage stellt sich mir bei deinem vorhaben eigentlich erst an zweiter stelle.
primär stellt sich mir die frage: wie bringst du den _server_ dazu, die datei mit dem richtigen content type header auszuliefern?
die meisten server haben doch da einfach ihre voreinstellungen, die nun mal von der dateiendung ausgehen bei der ermittlung, welchen content type header sie bei einer (bild-)ressource mitschicken sollen. diesen schritt müsste dein CMS dann doch noch irgendwie manuell übernehmen, oder? also jedes bild von einem script durchschleusen lassen, dass sich aus einer DB o.ä. über den bildtyp informiert, oder ihn erst aus der bilddatei selbst ausliest, und dann content type header gefolgt von den binären bilddaten an den browser sendet.
oder aber, alle jpegs in einen eigenen ordner, alle gifs in einen, alle pngs - und dann jeweils für den kompletten ordnerinhalt einen content type erzwingen.
wo da jetzt bei diesem - in meinen augen auf den ersten blick unperformanten (im vergleich zum default-mechanismus des servers, der von der dateiendung ausgeht) - vorgehen der vorteil für den kunden liegen soll, erschließt sich mir noch nicht.
wahsaga schrieb am 11.06.2004
ach so, jetzt checke ich das erst, du willst also gar keinen content type header vom server mitsenden lassen, sondern dich auf grund von
> the recipient may attempt to guess the media type via inspection of its content and/or the name extension(s) of the URL used to identify the resource
darauf verlassen, dass der client richtig "rät".
nun, da er bei deinem vorgehen eben nicht mehr die möglichkeit hat, auf grund des URLs auf den typ zu schliessen (dateiendung fehlt ja), bleibt also dem browser nichts anderes übrig, als wirklich erst mal den dateiinhalt selber zu checken, um zu erkennen, worum es sich handelt.
auch wenn's überwiegend klappen mag - ob's performant ist? ich zweifle da immer noch irgendwie.
und wie gesagt, den vorteil der methode sehe ich einfach nicht. warum sollte das fehlen von dateiendungen deinem kunden irgendwas erleichtern? gerade für den nicht erfahrenen anwender ist doch grundsätzlich dateiendung = dateiinhalt - wie ja z.b. eine anna_kournikova.jpeg.exe, bei der die eigentliche endung .exe auf grund der voreinstellung eines windows-systems ausgeblendet wird, in der vergangenheit schon recht anschaulich bewiesen hat ...
Jeena Paradies aus Bamberg schrieb am 11.06.2004
Da sprichst du etwas an was ich mir noch gar nicht überlegt hatte. Ich hatte wohl angenommen dass der Server in die Datei guckt und von selbst den richtigen Header schickt. Aber so wie du es darstellst schickt er wohl gar keinen und der Client muss dann selbst per Zufall entscheiden. Das ist natürlich nicht das was ich wollte.
Dadurch dass ich so wenig Informationen darüber gefunen hatte dachte ich mir die Arbeit vereinfacht zu haben wenn ich die Dateiendung weglasse und mein CMS einfach die ID der Nachricht als name des Bildes im /img/ Verzeichniss nehmen könnte ohne dass es herausfinden müsste welche Dateiendung diese Datei hat um sie zu referenzieren (also kein Vorteil für den Kunden nur für mich weniger programmieraufwand). Ich wunderte mich auch schon warum nicht viel mehr Leute auf diese Idee gekommen sind.
Na bevor ich das so umsetzte werde ich wohl noch ein wenig mehr forschen müssen. Danke für das Teilen deiner Gedankengänge.
Jeena
wahsaga schrieb am 11.06.2004
> Ich hatte wohl angenommen dass der Server in die Datei guckt und von selbst den richtigen Header schickt.
nein, das tut er AFAIK nicht. er schaut sich idR. einfach an, datei hat diese endung, also muss ich sie mit dem content-type xy ausliefern. beim apache-webserver wird das über die konfigurationsdatei mime.types geregelt, da sind allerlei mime-typen aufgelistet, und dahinter, für welche dateiendungen sie gelten sollen.
> wenn ich die Dateiendung weglasse und mein CMS einfach die ID der Nachricht als name des Bildes im /img/ Verzeichniss nehmen könnte ohne dass es herausfinden müsste welche Dateiendung diese Datei hat um sie zu referenzieren
ach so, darum geht es. ja, das ist ein verständlicher gedanke.
aber evtl. gibt es dafür ein andere einfache lösung (sofern dein webserver ein apache ist?): Multiviews
wenn das aktiviert ist, sucht der apache selbst nach dateien, die zum angegebenen dateinamen passen.
ich nutze das in meinem blog derzeit, um einfach auf z.b. "/impressum" verlinken zu können, obwohl die zugehörige datei eigentlich impressum.php heißt. da diese aber keinerlei parameter benötigt, war es mir zu unperformant, dafür eine eigene rewrite-rule zu definieren. also verlasse ich mich dabei auf die multiviews-option, mit der der server dann automatisch bei der anfrage nach "impressum" sucht, welche dateien habe ich denn, die zu diesem namen passen? aha, es gibt eine impressum.php, die scheint mir passend zu sein, also liefere ich deren inhalt zurück.
da die script-datei physisch auf dem server jetzt aber wirklich impressum.php heißt, weiß der server auch automatisch, die muss ich mit dem content type text/html ausliefern, und ausserdem durch den php-parser schicken.
ich denke mal, dass dürfte mit bildern genauso gut funktionieren. dann könntest du also so vorgehen, wie du es wolltest - benennst das bild einfach mit der ID des beitrages PLUS der richtigen dateiendung, also 14.jpg oder 23,gif
im html-code referenzierst du jetzt aber nur auf "/img/14" bzw. "/img/23".
durch multiviews schaut der server jetzt selber nach, welche dateien passen denn zu dem namen, und liefert das richtige bild zurück. da jetzt aber die endung trotzdem physisch auf der platte zum dateinnamen gehört, kann er jetzt auch wieder in seiner mime.types-datei nachschauen, welcher content-type ist denn der richtige für die endung .jpg und welcher für die endung .gif.
damit hättest du auch erreicht, was du wolltest - ohne, dass es zu irgendwelchen client-imkompabilitäten kommen kann, weil obwohl die bilddatei ohne endung angefordert wurde, der server den passenden content-type ermitteln und mitschicken kann.
du musst dann natürlich nur noch darauf achten, dass nicht zwei bilder 14.jpg und 14.gif inm bildverzeichnis abgelegt werden können - denn sonst mus der server bei aufruf von /img/14 entscheiden, welches bild er zurückliefert - und das ist dann möglicherweise das "falsche".
Jeena Paradies aus Bamberg schrieb am 11.06.2004
> beim apache-webserver wird das über die konfigurationsdatei mime.types geregelt,
Ja kann mich noch erinnern dass ich da mal css einfügen musste damit der Mozilla mein Stylesheet mit dem richtigen content-type bekommt und anzeigt.
> Du musst dann natürlich nur noch darauf achten, dass nicht zwei bilder 14.jpg und 14.gif inm bildverzeichnis abgelegt werden können
Da die Nachrichten ja sowieso unique IDs haben die durch die Datenbank vergeben werden wird das nicht passieren. Der Kunde selbst kann den Namen der Datei nicht beeinflussen. Ich muss nur noch herausfinden wie ich die gerade angelegte ID nach dem anlegen des Datensatzes zurückbekomme dann klappt das.
Danke für den Gedanken mit den Multiviews das käme mir zur Zeit nicht in den Sinn. Da ich den Apachen benutze werde ich das so machen wie du vorgeschlagen hast.
Struppi aus Mainz schrieb am 28.05.2005
Im FF 1.0.4 ist das Bild kaputt.
Jeena Paradies aus Varberg schrieb am 28.05.2005
Hm das Bild scheint jetzt überall kaputt zu sein, ich lade es noch mal neu hoch.
Felix Riesterer aus Ellwangen schrieb am 28.05.2005
Jeena Paradies aus Varberg schrieb am 29.05.2005
Heidibimbam, und der Fehler ist ja schon fast ein Jahr alt ;-)
struppi aus Mainz schrieb am 30.05.2005
Jo, jetzt geht's auch mit dem 1.4er