Upload schlägt fehl bei großen Bildern in der Galerie

 

Die Handyfotos vom Wochenende sind problemlos in der Galerie gelandet, doch das Panorama vom Aussichtsturm mit 18 MB will einfach nicht durch. Oder die neue Kamera liefert plötzlich Dateien, an denen jeder Versuch scheitert. Der Upload schlägt fehl, und trotzdem ist das Bild in solchen Fällen fast nie kaputt. Auf dem Weg vom Browser in den Bilderordner passiert die Datei mehrere Kontrollstellen, und jede hat ihre eigene Obergrenze. Wer weiß, an welcher Stelle sein Foto hängen geblieben ist, ändert genau einen Wert und ist fertig.

Upload schlägt fehl: Ein Foto mit 18 MB passt nicht durch die Engstelle, PHP erlaubt ab Werk 2M je Datei und 8M je Sendung

Welche Schranke den Upload stoppt

Zuerst nimmt der Webserver die Anfrage entgegen. Auf einem eigenen Server kann er schon hier ablehnen, bei nginx über client_max_body_size, bei Apache über LimitRequestBody. Dann liest PHP die Daten ein und prüft, ob die ganze Sendung unter post_max_size bleibt und jede Datei unter upload_max_filesize. Erst danach beginnt das Galerie-Script mit seiner Arbeit, und dabei zählen Laufzeit und Arbeitsspeicher. Welche Stelle klemmt, verrät meist schon das Symptom:

SchrankeWo sie sitztWas Sie dann sehen
client_max_body_size, LimitRequestBodyWebserver, vor PHPFehlerseite des Servers, oft „413 Request Entity Too Large“
post_max_sizePHP, ganze Sendungalle Bilder fehlen, auch die kleinen
upload_max_filesizePHP, jede einzelne Dateinur das große Bild fehlt, die anderen sind da
max_input_timePHP, Dauer des EinlesensAbbruch nur bei langsamer Leitung: zu Hause klappt es, unterwegs nicht
max_execution_time, memory_limitPHP, Verarbeitung im ScriptBild kommt an, aber das Vorschaubild fehlt oder die Seite bleibt weiß

Eine Falle steckt im Zusammenspiel der beiden Größenwerte. PHP liefert ab Werk 2 MB je Datei und 8 MB je Sendung aus. Hebt jemand nur upload_max_filesize auf 32M an und vergisst post_max_size, bleibt die alte Grenze bestehen: Jeder Upload schlägt fehl, sobald das Bild mehr als 8 MB hat, weil vorher schon die Sendung als Ganzes scheitert. Die Sendung ist außerdem immer ein paar Kilobyte größer als die Datei selbst, denn Formularfelder und Trennzeilen reisen mit.

Grenzen beim Webhoster anheben

Welcher Weg funktioniert, hängt davon ab, wie Ihr Webhoster PHP betreibt. Probieren Sie die Möglichkeiten in dieser Reihenfolge:

  1. Kundenmenü: Bei vielen Tarifen gibt es eine Seite mit PHP-Einstellungen, auf der Sie die Werte aus einer Liste wählen. Das ist der sicherste Weg, weil der Webhoster ihn ausdrücklich vorsieht.
  2. .user.ini: Läuft PHP als FastCGI oder FPM, legen Sie diese Datei in den Galerie-Ordner und schreiben die Werte zeilenweise hinein. PHP liest sie nur in Abständen neu ein, rechnen Sie mit bis zu fünf Minuten Wartezeit.
  3. .htaccess: Zeilen wie php_value post_max_size 64M wirken nur, wenn PHP als Apache-Modul läuft. Sonst antwortet der Server mit einem Fehler 500, und Sie nehmen die Zeilen wieder heraus.
  4. php.ini: Auf einem eigenen Server oder vServer ändern Sie die zentrale Datei und starten PHP neu. Denken Sie dort auch an die Grenze des Webservers.

Ob eine Änderung wirkt, sehen Sie ohne Umweg: Rufen Sie in der Galerie die Seite „Bilder hochladen“ neu auf. Sie liest die Werte bei jedem Aufruf frisch aus. Bleiben die Zahlen gleich, hat der gewählte Weg nicht gegriffen, und Sie versuchen den nächsten. Hilft keiner, fragen Sie den Support Ihres Webhosters nach den Grenzen Ihres Tarifs. Manche Pakete erlauben schlicht nicht mehr als 8 oder 16 MB. Dort hilft keine Einstellung: Jeder größere Upload schlägt fehl, bis die Datei unter die Grenze passt.

Oder die Fotos kleiner machen

Oft ist es einfacher, das Bild an die Grenze anzupassen als umgekehrt. Ein 24-Megapixel-Foto hat 6000 × 4000 Pixel und als JPEG schnell 10 MB. Die Galerie zeigt in der großen Ansicht ab Werk höchstens 1024 Pixel, Besucher sehen also keinen Unterschied zu einer Fassung mit 2000 Pixeln Kantenlänge, und die wiegt meist unter 1 MB. Auch der Server merkt es: Zum Verkleinern hält die Bildbibliothek GD jedes Pixel mit 4 Byte im Speicher. Beim großen Foto sind das mit Reserve rund 125 MB, bei der kleinen Fassung keine 20 MB.

Passende Werte statt Maximalwerte

Die Grenzen auf 1 GB zu drehen, löst kein Problem, es verschiebt es nur: Bei einer abgebrochenen Verbindung wartet man dann länger auf die Fehlermeldung. Rechnen Sie lieber von Ihren Fotos aus:

  • Größte Datei: Sortieren Sie den Fotoordner nach Größe. Ist das größte Bild 14 MB groß, reicht upload_max_filesize = 20M mit Luft nach oben.
  • Stapelgröße: Überlegen Sie, wie viele Bilder Sie typischerweise auf einmal schicken. Zehn Handyfotos à 5 MB sind 50 MB, also passt post_max_size = 64M.
  • Anzahl: max_file_uploads steht ab Werk auf 20. Wer gern ganze Ordner auswählt, setzt 50.
  • Leitung: 64 MB brauchen bei 10 Mbit/s im Upload knapp eine Minute. Für langsamere Anschlüsse heben Sie max_input_time auf 300 Sekunden.

Danach testen Sie mit dem größten Bild und mit einem vollen Stapel. Kommen beide durch, stimmen die Werte. Andernfalls zeigt die Meldung der Galerie, welcher Wert noch zu knapp ist. Fällt nur das Vorschaubild aus, ist der Arbeitsspeicher der nächste Kandidat.

Was die Galerie meldet, wenn ein Upload fehlschlägt

Im Bildergalerie-Script müssen Sie die Grenzen nicht erst über phpinfo() suchen. Die Seite „Bilder hochladen“ liest sie aus der PHP-Konfiguration Ihres Webhosters und schreibt sie unter die Fläche „Bilder auswählen / oder hierher ziehen“, etwa so: „Ihr Webhoster erlaubt höchstens 20 MB je Bild, 64 MB je Vorgang und 30 Bilder auf einmal.“ Ist post_max_size kleiner als upload_max_filesize, nennt sie gleich den kleineren Wert als Grenze je Bild, denn mehr geht dann ohnehin nicht.

Mit eingeschaltetem JavaScript prüft schon der Browser Ihre Auswahl: Zu große Einzelbilder markiert die Liste mit „zu groß“, und bei zu vielen Bildern oder einem zu schweren Stapel lässt sich das Formular gar nicht erst abschicken. Kommt die Sendung trotzdem nicht durch, nennt die Galerie das betroffene Bild und den Grund. An der Meldung erkennen Sie, welche Einstellung Sie anheben müssen:

Meldung der GalerieZuständige Grenze
„… ist zu groß (max. … je Bild) und wurde nicht hochgeladen.“upload_max_filesize
„Die ausgewählten Bilder sind zusammen zu groß (…). … Es wurde nichts hochgeladen.“post_max_size
„Ihr Webhoster nimmt höchstens … Bilder auf einmal an.“max_file_uploads
„… wurde nur unvollständig übertragen.“abgebrochene Verbindung: erneut hochladen, bei langsamer Leitung max_input_time erhöhen
„Das Script darf nicht in den Ordner … schreiben.“keine PHP-Grenze: Ordnerrechte per FTP auf 755 oder 775 setzen

Ein Rechenbeispiel zeigt, warum post_max_size meist zuerst greift. Bei 20 MB je Bild und 64 MB je Vorgang kommt jedes einzelne Foto mit 6 MB problemlos durch. Wählen Sie aber zwölf davon auf einmal aus, sind das 72 MB, und der ganze Upload schlägt fehl, weil PHP die Sendung verwirft. Die Galerie erkennt das und lädt dann gar nichts hoch. Mit zehn Bildern je Durchgang, also 60 MB, klappt es. Als Ausgangswert für die eigene php.ini oder .user.ini nennt die Dokumentation upload_max_filesize = 20M, post_max_size = 64M, max_file_uploads = 50 und max_input_time = 300.

Die Prüfungen laufen in einer festen Reihenfolge ab, und daraus folgt, welche Meldung Sie bekommen. Scheitert schon die ganze Sendung, prüft niemand mehr die einzelnen Bilder. Kommt die Sendung durch, wird jedes Bild für sich bewertet, und ein Ausfall betrifft nur dieses eine. Das Diagramm spielt drei Fälle durch:

Animiertes Prüfketten-Diagramm: Ein Upload passiert nacheinander Webserver, post_max_size, upload_max_filesize, Formatprüfung, Ordnerrechte und memory_limit; gezeigt werden ein zu großes Foto, ein zu schwerer Stapel und ein Foto, das durchkommt
Sechs Kontrollstellen hintereinander: Wo ein Bild hängen bleibt, bestimmt die Meldung und den Wert, den Sie ändern müssen.

Leere Seite oder Fehler 500 nach dem Hochladen

Kommt statt der Ergebnisseite eine leere Seite oder ein Fehler 500, hilft ein Blick ins Fehlerprotokoll des Servers. Häufige Ursachen sind eine zu kurze max_execution_time oder eine Firewall wie mod_security, die große Anfragen blockiert; für Letztere kann nur der Webhoster eine Ausnahme einrichten. Das Script gibt jedem Bild bis zu 120 Sekunden Laufzeit, sofern der Server das zulässt.

Den Arbeitsspeicher prüft es vor dem Verkleinern selbst: GD braucht etwa 4 Byte je Pixel, ein Foto mit 24 Megapixeln also rund 100 MB. Reicht memory_limit nicht, hebt das Script den Wert an, wenn der Server es erlaubt. Erlaubt er es nicht, bleibt das Bild trotzdem in der Galerie, und Sie bekommen den Hinweis, dass das Vorschaubild „beim ersten Aufruf der Galerie“ entsteht. Dann hilft ein höheres memory_limit, etwa 256M, oder ein kleineres Foto.

Wenn es nicht an der Größe liegt

Zwei Fälle sehen aus wie ein Größenproblem, haben aber eine andere Ursache:

  • Falsches Format: Ein HEIC-Upload schlägt fehl, egal wie klein die Datei ist. iPhone-Fotos im Format HEIC und WebP-Bilder lehnt die Galerie mit einer eigenen Meldung ab, sie nimmt nur JPEG, PNG und GIF an. Stellen Sie die Kamera auf „Maximale Kompatibilität“ oder wandeln Sie die Dateien vor dem Hochladen in JPEG um.
  • Sehr viele Fotos: Für Hunderte großer Fotos ist der FTP-Import unter „Bilder verwalten“ bequemer. Er kennt keine Upload-Grenze von PHP und übernimmt höchstens 100 Bilder je Klick.

Das Bildergalerie-Script können Sie kostenlos herunterladen und die Anzeige der Grenzen auf Ihrem eigenen Webspace ansehen.

Häufige Fragen

Beim Anheben der Upload-Grenzen tauchen immer wieder dieselben Detailfragen auf, etwa zu konkreten Werten und zur Reihenfolge.

Welche Werte sollte ich für upload_max_filesize und post_max_size setzen?

Nehmen Sie Ihre größte Bilddatei und runden Sie großzügig auf, bei 14 MB etwa auf 20M. Für post_max_size multiplizieren Sie die übliche Fotogröße mit der Zahl der Bilder, die Sie gern auf einmal schicken, und geben etwas Reserve dazu. Zehn Fotos à 5 MB passen gut in 64M. Wichtig ist nur, dass post_max_size immer über upload_max_filesize liegt.

Wie finde ich heraus, welche Upload-Limits aktuell wirklich gelten?

In der Galerie steht die Antwort unter der Auswahlfläche auf „Bilder hochladen“. Ohne Galerie legen Sie eine Datei mit dem Inhalt <?php phpinfo(); ?> an, öffnen sie im Browser und suchen nach upload_max_filesize, post_max_size und max_file_uploads. Die Spalte „Local Value“ zählt. Löschen Sie die Datei danach wieder, sie verrät Fremden viel über Ihren Server.

Der Upload bricht trotz hoher Dateigrenze ab, woran liegt das noch?

Meist wurde post_max_size nicht mitgezogen. Bricht der Upload nur über langsame Leitungen ab, ist max_input_time zu knapp. Auf eigenen Servern begrenzt zusätzlich der Webserver, bei nginx etwa client_max_body_size. Und eine Firewall wie mod_security kann große Anfragen abweisen, bevor PHP sie überhaupt sieht.

Der Upload schlägt fehl, obwohl ich die Werte geändert habe. Warum zeigt die Galerie noch die alten Grenzen?

Weil die Änderung nicht wirkt: Die Seite „Bilder hochladen“ liest die Werte bei jedem Aufruf frisch aus PHP. Häufige Gründe sind .htaccess-Zeilen mit php_value auf einem Server, auf dem PHP nicht als Apache-Modul läuft; dort brauchen Sie eine php.ini oder .user.ini. Eine .user.ini liest PHP je nach Server erst nach einigen Minuten neu ein.

Verwandte Themen

Wer an diesen Grenzwerten dreht, stößt schnell auf die folgenden Themen rund um PHP-Einstellungen und Galerie-Leistung.