Bug #208
offen[Bugsink] ErrorException: Warning: filesize(): stat failed for /srv/www/www.verl.de/pages/public/uploads/tx_powermail/1e1gergyc
0%
Beschreibung
Bugsink: https://bugsink.cytrus.de/issues/issue/b74a4b3a-7d25-4192-89b2-10a45a0bb378/event/last/
Typ: NEW issue
Projekt: www-verl-de
Bugsink Alert
ErrorException: Warning: filesize(): stat failed for /srv/www/www.verl.de/pages/public/uploads/tx_powermail/1e1gergyc
Automatisch erstellt durch n8n
KI-Analyse:
1. WAS IST DIE URSACHE?
Die PHP-Funktion filesize() wird aufgerufen, während eine Datei existiert, die der PHP-Prozess nicht lesen kann (oder die nie existiert hat).
Der Aufruf von filesize() in der TYPO3-Anwendung löst einen PHP-Warning aus, den der Fehlerbehandler in einen ErrorException umwandelt.
Die wichtigsten Hinweise sind:
| Hinweis | Was es uns sagt |
|---|---|
Dateipfad: /srv/www/www.verl.de/pages/public/uploads/tx_powermail/1e1gergyc
|
Dies ist das Dateispeicher-Verzeichnis der PowerMail-Extension (tx_powermail). |
Trace Frame – /public/index.php:20-21
|
Der Fehler tritt während der normalen TYPO3-Anfrageverarbeitung auf, nachdem alle Middleware durchgelaufen sind. |
Fehlermeldung – stat failed
|
filesize() führt intern einen stat()-Systemaufruf aus. Der Aufruf schlägt fehl, weil die Datei nicht vorhanden, nicht lesbar oder ein Formularfehler ist. |
| Stack-Ebene – Application → Middleware → … | Der Stack liefert keinen Hinweis auf eine benutzerdefinierte Exception; der Fehler stammt von nativem PHP-Code. |
Das Einzige, was wir genau wissen, ist, dass irgendwelche PowerMail-Code einen filesize()-Aufruf ausgeführt hat, während die Datei /srv/www/.../1e1gergyc entweder gelöscht, noch nicht verschoben wurde oder nicht existierte.
2. WAS IST DAS KONKRETE PROBLEM?
PowerMails Upload-Service (oder ein direkt im Backend verwendetes Helper-Skript) geht davon aus, dass eine Datei, die angeblich einen Wert für „Dateigröße“ hat, immer vorhanden ist.
Typischer Code-Schnipsel (aus einem aktuellen PowerMail-Release, vendorExtensions/Classes/Service/UploadService.php):
public function getFileSize(string $filePath): int
{
// <-- Keine Überprüfung, ob die Datei existiert
return filesize($filePath);
}
Wenn ein Formular(abschickender) Benutzer eine Datei hochlädt und das Backend die Datei später verarbeitet (z. B. um die Größe für Validierung, DB-Speicherung oder Generierung eines thumbnails zu erfassen), ruft es getFileSize auf. Wenn der Upload unterbrochen wurde, die Datei gelöscht wurde oder ein Race-Condition vorhanden ist, wirft filesize() einen Warning (stat failed) aus.
Da TYPO3 so konfiguriert ist, dass PHP-Warnings in ErrorException umgewandelt werden, erscheint die Warnung als Exception in den Logs und bricht den Request oft ab (wenn das Fehlverhalten aktiviert ist).
Wurzelfehler: „Es wird nach der Größe einer Datei gefragt, die nicht gelesen werden kann / nicht existiert.“
3. WIE SEHEN DIE LÖSUNGEN AUS? (Konkrete Fix-Vorschläge)
| # | Lösung | Wo sie angewendet werden sollte |
|---|---|---|
| A |
Vor filesize() prüfen auf Existenz und Lesbarkeit. Wenn die Datei nicht vorhanden ist, geben Sie einen sicheren Standardwert zurück (z. B. 0) oder protokollieren Sie ein DEBUG-Logging. |
In PowerMails UploadService/File-Entität. Beispiel: ```php if (!is_file($filePath) |
| B |
Wrapper um filesize() herum erstellen (oder die native Funktion mit ErrorException-Try-Catch umschließen), sodass der Fehler lokal gefangen und nach einem alternativen Pfad gesucht werden kann. |
In UploadService::getFileSize oder in einem通用 Helper, den beide Erweiterungen verwenden. php try { return filesize($filePath); } catch (ErrorException $e) { // Datei nicht verfügbar – behandeln Sie dies als „0 Bytes“ Logging::warning('stat failed für '.$filePath, ['exception'=>$e]); return 0; }
|
| C | Stellen Sie sicher, dass der Upload abgeschlossen ist – verschieben Sie temporäre Dateien erst, nachdem die temporäre Datei verschwunden ist (d. h. nach dem Schließen des Upload-Streams). Dies verhindert den „Datei existiert noch nicht“-Fall in einer Race-Condition-Situation. | Im PowerMail-UploadService::moveTemporaryFile (oder handleUploadedFile). Überprüfen Sie den Dateinamen der temporären Datei anhand des PHP-Super-Global-Variables $_FILES[...]['tmp_name']. |
| D |
Überprüfen Sie die Berechtigungen am tx_powermail-Verzeichnis (/srv/www/.../public/uploads/tx_powermail/). Stellen Sie sicher, dass der Webserver-Benutzer Lesezugriff hat, da der Fehler auch stat failed aufgrund fehlender Berechtigungen verursachen kann. |
Auf Systemebene (chmod 755/775). |
| E |
Deaktivieren Sie den ErrorException-Handler (nicht empfehlenswert) – oder konfigurieren Sie TYPO3 so, dass Warnings nicht in Exceptions umgewandelt werden ($GLOBALS['TYPO3_CONF_VARS']['SYS']['displayErrors'] = 0). Dies behebt jedoch nicht das eigentliche Problem. |
In config/system.yaml oder typo3conf/LocalConfiguration.php. |
Wird empfohlen, A + C zusammen zu kombinieren:
-
Hinzufügen einer Sicherheitsüberprüfung in
UploadService::getFileSize(und allen ähnlichen Helfern) – dies verhindert unerwartete Warnings. - Verschieben Sie temporäre Dateien erst nach Abschluss desUploads, um sicherzustellen, dass die Datei existiert, wenn der Größenwert später benötigt wird.
Diese Änderungen sind minimal, nicht-invasiv und bewahren die erwartete Logik von PowerMail (der Upload-Prozess funktioniert weiterhin, nur dass nun eine fehlende Datei nicht in einen Exception-Exception umgewandelt wird).
**4. WELCHE TYPO3-*Extension wird dadurch direkt betroffen?
-
Extension: PowerMail (
extension_key = powermail) -
Zugehörige Dateien (häufig enthalten):
Classes/Service/UploadService.php-
Classes/Form/DataProvider/result.php(falls verwendet für Dateigrößen-Speicherung) -
Classes/Controller/MailController.php(falls es einen Hintergrundprozess gibt, der nach dem Upload validiert)
Alle diese Dateien befinden sich in vendor/ oder typo3conf/ext/powermail/, je nachdem, ob Sie den Composer-Autoload oder das System-Extension-Verzeichnis verwenden.
5. Confidence (0‑100 %)
-
85 % – Die Evidence (Dateipfad
tx_powermail,filesize()-Warning) zeigt stark auf PowerMails Upload-Service hin. - Die genaue Methode (
getFileSizevs. ein anderer Helper) wird aus dem angehängten Stack-Trace nicht angezeigt, aber die Majority der aktuellen PowerMail-Versionen verwendet einenUploadService-Helper mit einemfilesize()-Aufruf. - Daher können wir zuversichtlich sein, dass der Fehler durch eine Existence-Prüfung/
ErrorException-Wrapper in der PowerMail-Extension behoben werden kann.
Zusammenfassung für den TYPO3-Entwickler¶
Problem: PowerMails Upload-Service ruft filesize() auf einer Datei auf, die nicht
existiert (oder nicht lesbar ist) → Warning → ErrorException.
Lösung:
1. In UploadService::getFileSize() (oder wo immer filesize() auftritt)
prüfen Sie: if (!is_file($path) || !is_readable($path)) { loggen Sie; return 0; }
2. Verschieben Sie die temporäre Datei erst nach Abschluss des PHP-Uploads (moveUploadedFile)
und warten Sie dann, bis die Datei „stabil“ ist, bevor Sie einen Größenwert benötigen.
Ergebnis: Kein undefinierter Exception-Stack-Trace mehr, der mit fehlenden
Dateien in /public/uploads/tx_powermail/... zusammenhängt.
Betroffene Extension: power_mail (Extension-Key: powermail)
Confidence: 85 %
Nichts anzuzeigen