Letztens habe ich versucht, einen GPS-Track als GPX-Datei (.gpx) auf eine Website hochzuladen. Ziel war es, den GPS-Track anderen Leuten als Download zur Verfügung zu stellen. Der Versuch scheiterte zunächst kläglich. Ursache waren die WordPress Mime-Types, wie ich schnell herausfinden konnte.
Inhalt
WordPress lässt nur bestimmte Dateitypen zu
Standardmäßig kann man mit dem integrierten Uploader nämlich nur bestimmte Dateitypen hochladen. Welche, das bestimmen die WordPress Mime-Types. Man könnte auch sagen, die Dateiendung muss stimmen, sonst verweigert WordPress den Upload. Das ist ja eigentlich aus Sicherheitsaspekten sehr gut, denn so können potentiell schädliche Dateien, die beim normalen Betrieb einer Website nicht benötigt werden, gar nicht erst hochgeladen werden. Eine .exe-Datei kann man also gar nicht in die Mediathek hochladen.
Erlaubte WordPress Mime-Types
Eine Übersicht der erlaubten Dateitypen bzw. Dateiendungen (WordPress Mime-Types gibt es hier. Das sind neben Bilddateien überwiegend weitere Mediadateien, wie gängige Audio- und Videoformate. Aber auch Office-Dateien (.ppt, .xls, .odt, .doc) kann man hochladen.
Das sind also auch bereits zahlreiche Formate, die potentiell Schadcode enthalten können. Also kann man aus Sicherheitsaspekten erstmal nichts gegen eine sinnvolle Erweiterung der Mime-Types haben, besonders dann nicht, wenn man diese Dateien für den Betrieb der Webseite braucht. Das Format SVG wird auch von Haus aus nicht unterstützt, aber oft benötigt. Und wenn man Joggingstrecken, Wanderrouten oder Fahrradtouren als GPS-Tracks auf seiner Webseite bereitstellen will, dann braucht man eben die Möglichkeit, GPX-Dateien in die WordPress Mediathek hochzuladen.
WordPress Multisite bringt das Feature von Haus aus mit
Da ich häufig mit WordPress-Multisites arbeite, guckte ich erstmal in den Einstellungen. Denn in der Multisite-Installation kann man unter Werkzeuge > Netzwerkeinstellungen die benötigten weiteren Mime-Types einfach ergänzen. Gewünschte Dateiendung einfügen, fertig. Leider gibt es diese Möglichkeit nicht in einer Standard-Installation von WordPress. Warum eigentlich nicht? Gute Frage!
Plugin oder Handarbeit?
Bei der Google-Suche nach einem entsprechenden Plugin stieß ich erstmal auf den tollen Beitrag von Raffael zum Thema erlaubte Dateitypen für den Upload in WordPress. Die dort vorgestellten Lösungen haben mir sehr geholfen, die Lösung zu finden.
Erlaubte Dateitypen für den Upload mit einem WordPress Plugin ändern
Wer nicht in den Quellcode seines WordPress-Themes eingreifen möchte oder kann, bedient sich zur Änderung der erlaubten Mime-Types einfach eines Plugins. Das Plugin WP Extra File Types leistet, was er Titel verspricht.
WordPress Mime-Types über den PHP-Code ändern
Statt ein weiteres Plugin zu installieren, wollte ich aber lieber Handarbeit leisten und das Problem mit einer Funktion lösen. Immer mehr Plugins blähen jede WordPress Installation irgendwann auf und beeinträchtigen die Leistung. Außerdem steigt das Risiko, dass irgendwann ein Plugin mangels Update nicht mehr funktioniert. Spätestens dann wird man sich mit der Lösung des Problems auf der Ebene des PHP-Quellcodes in der functions.php auseinandersetzen müssen.
Den richtigen Mime-Type für GPX Dateien finden
In dieser Übersicht über die meisten Mime-Typen habe ich .gpx-Dateien leider nicht gefunden. Google hilft hier aber weiter, die korrekte Bezeichnung des Mime-Type für GPX-Dateien lautet application/gpx+xml.
Welcher Filter? – upload_mimes oder mime_types?
Im oben verlinkten Beitrag findet sich ein Codeschnipsel, der das Problem lösen kann, bei mir hat es aber nach Anpassung jedenfalls nicht funktioniert. Das wird daran liegen, dass dort der WordPress-API-Filter upload_mimes benutzt wurde, in den die Funktion eingeklinkt wurde, um das Array mit den erlaubten Dateitypen bearbeiten können. Um Mime-Types hinzuzufügen oder zu entfernen, wird das Array der erlaubten Dateitypen verändert. Wenn man aber nicht aufpasst, dann zerschießt man mit diesem Filter das vorhandene Array. So war es jedenfalls bei mir, nachdem ich den Code so verwendet hatte, funktionierte zwar der Upload des neu hinzugefügten Dateityps GPX-Datei (.gpx), aber ich konnte keine anderen Dateien mehr hochladen, auch kein .jpg mehr.
Bessere Lösung: den Filter mime_types verwenden
Auf der Ursachesuche bin ich unter anderem auf diesen englischsprachigen Beitrag zum Hinzufügen von Mime-Types gestoßen. Dort wird das Problem sehr deutlich erklärt und eine andere Möglichkeit gewählt. Man kann auch auf die Funktion wp_get_mime_types() zugreifen die in der Datei wp-includes/functions.php im WordPress-Core zu finden ist. Zu dieser Funktion stellt WordPress einen Filter mit dem Namen mime_types bereit. Im WordPress Codex wird auch explizit angegeben, dass man diesen Filter zum Hinzufügen von erlaubten WordPress Dateitypen nutzen soll. Zum Entfernen von erlaubten WordPress Dateitypen soll man hingegen den Filter upload_mimes nutzen.
Codeschnipsel um GPX-Dateien in WordPress hochzuladen
Der fertige PHP-Code, um den Upload von GPX-Dateien in die WordPress Mediathek zu ermöglichen sieht so aus. Der Code funktionierte bei mir und ich konnte GPX-Dateien und auch alle anderen zuvor erlaubten Dateitypen hochladen.
function my_theme_custom_upload_mimes( $existing_mimes ) { // gpx zur Liste der erlaubten Mime-Types hinzufuegen $existing_mimes['gpx'] = 'application/gpx+xml'; // Return des Array mit dem hinzugefuegten Mime-Type gpx return $existing_mimes; } add_filter( 'mime_types', 'my_theme_custom_upload_mimes' );
Kein Zugriff auf die hochgeladene GPX-Datei
Nachdem der Upload endlich reibungslos funktionierte musste ich allerdings feststellen, dass man auf die GPX-Datei nicht zugreife konnte. Laut FTP lag sie im WordPress Uploads Verzeichnis, was war das Problem? Nun, es lag am IIS. Wenn der den neuen Mime-Type nicht kennt, dann kann man auf die Dateien eben nicht zugreifen. Die Lösung unter Plesk findet man hier.
Schreibe einen Kommentar