Wenn Uppy im Frontend verwendet wird, werden die hochgeladenen Dateien zwar im Mediapool gespeichert, aber die Liste im Frontend bleibt leer und zeigt die Warnung:
Upload success event but invalid response body
Die Response vom Upload-Handler wird nicht korrekt verarbeitet. Dies kann mehrere Gründe haben:
- Fehlende oder falsche API-Token-Authentifizierung
- Zusätzlicher Output vor der JSON-Response (Warnings, Notices)
- Falsche Response-Struktur
WICHTIG: Der API-Token darf niemals im HTML-Code ausgegeben werden (z.B. als data-api-token), da er sonst für jeden Besucher sichtbar ist!
Nutzen Sie stattdessen die PHP-Session - dafür gibt es Utils::init(), das den Token
in die Session schreibt und die passenden CSS-/JS-Tags ausgibt (siehe
frontend_usage.md):
<?php
use FriendsOfRedaxo\Uppy\Utils;
// EINMALIG am Anfang des Templates/Moduls ausführen (vor der HTML-Ausgabe)
echo Utils::init();
?>
<!-- Feld-Markup: keine data-Attribute von Hand pflegen, keine eigene Signatur -->
<?= Utils::field('my_upload_field', [
'category_id' => 0,
'max_files' => 5,
'max_filesize' => 10,
'allowed_types' => 'image/jpeg,image/png,application/pdf',
]) ?>Das im JS-Bundle enthaltene Custom-Widget initialisiert Felder mit
class="uppy-upload-widget" (das Utils::field() automatisch setzt) beim Laden der
Seite selbst - ein eigenes Init-<script> im Template ist nicht nötig.
Um zu sehen, was genau schiefgeht, aktivieren Sie den Debug-Modus in den Uppy-Einstellungen:
- Backend → AddOns → Uppy → Einstellungen
- "Debug-Logging aktivieren" → Ja
- Speichern
Dann schauen Sie in:
- Browser Console (F12): Zeigt die Response-Struktur
- REDAXO Log (System → Logdateien): Zeigt die PHP-seitige Response
- API-Token ist nicht gesetzt oder falsch
- Session wurde nicht gestartet
- Token stimmt nicht mit dem im Backend konfigurierten überein
Lösung:
// Prüfen ob Token korrekt ist
$configToken = rex_config::get('uppy', 'api_token');
$sessionToken = rex_session('uppy_token', 'string', '');
if (!$configToken) {
echo 'FEHLER: API-Token ist nicht konfiguriert!';
echo 'Bitte im Backend unter AddOns → Uppy → Einstellungen einen Token generieren.';
}
if ($configToken !== $sessionToken) {
echo 'FEHLER: Session-Token stimmt nicht überein!';
rex_set_session('uppy_token', $configToken);
}- Die Response hat nicht die erwartete Struktur
{success: true, data: {filename: "..."}} - Es gibt zusätzlichen Output vor der JSON-Response
Lösung:
// In der boot.php oder im Template sicherstellen, dass kein Output vor der JSON-Response kommt
// Keine echo, print_r, var_dump, etc. vor dem Upload
// Alternativ: Error Reporting im Frontend reduzieren
if (!rex::isBackend()) {
error_reporting(E_ERROR | E_PARSE);
}Wenn Sie YCom verwenden und Benutzer eingeloggt sind, funktioniert Uppy auch ohne API-Token:
<?php
use FriendsOfRedaxo\Uppy\Utils;
// Prüfen ob Benutzer eingeloggt ist
if (!rex_ycom_auth::getUser()) {
echo 'Bitte melden Sie sich an, um Dateien hochzuladen.';
exit;
}
echo Utils::assets(); // kein Token nötig -> ensureApiSession()/init() kann hier entfallen
?>
<?= Utils::field('my_upload_field', [
'category_id' => 0,
'max_files' => 5,
'max_filesize' => 10,
'allowed_types' => 'image/jpeg,image/png',
]) ?><?php
use FriendsOfRedaxo\Uppy\Utils;
// Formular-Verarbeitung
if (rex_post('submit', 'string')) {
$files = rex_post('my_upload_field', 'string');
if ($files) {
$fileArray = explode(',', $files);
echo '<p>Hochgeladene Dateien: ' . count($fileArray) . '</p>';
echo '<ul>';
foreach ($fileArray as $filename) {
echo '<li>' . htmlspecialchars($filename) . '</li>';
// Datei aus Mediapool laden
$media = rex_media::get($filename);
if ($media) {
echo '<br><img src="' . $media->getUrl() . '" style="max-width: 200px;">';
}
}
echo '</ul>';
} else {
echo '<p>Keine Dateien hochgeladen.</p>';
}
}
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Uppy Frontend Upload</title>
<?= Utils::assets() ?>
</head>
<body>
<h1>Dateien hochladen</h1>
<?php Utils::ensureApiSession(); // Token in die Session schreiben, bevor das Formular ausgegeben wird ?>
<form method="post">
<label>Bilder hochladen:</label>
<?= Utils::field('my_upload_field', [
'category_id' => 0,
'max_files' => 5,
'max_filesize' => 10,
'allowed_types' => 'image/jpeg,image/png',
]) ?>
<button type="submit" name="submit" value="1">Formular absenden</button>
</form>
</body>
</html>Kein eigenes Init-<script> nötig - Utils::assets() lädt das Custom-Widget-Bundle,
das Felder mit class="uppy-upload-widget" (von Utils::field() gesetzt) selbst
initialisiert.
- ✅ API-Token ist in den Einstellungen generiert
- ✅
Utils::init()bzw.Utils::ensureApiSession()läuft vor der Formular-Ausgabe - ✅ Session-Token stimmt mit dem konfigurierten Token überein
- ✅ Debug-Logging ist aktiviert
- ✅ Browser Console zeigt Response-Struktur
- ✅ REDAXO Log zeigt keine PHP-Fehler
- ✅ Bundles sind aktuell (nach Code-Änderungen neu builden!)
Nach Änderungen an den JavaScript-Dateien:
cd /Users/thomas/redaxo_instances/core/project/public/redaxo/src/addons/uppy
npm run buildBei weiteren Problemen:
- Browser Console (F12) öffnen
- Network-Tab öffnen
- Upload durchführen
- Request an
rex-api-call=uppy_uploadersuchen - Response-Tab prüfen: Was kommt zurück?
- Console-Tab prüfen: Was sagt die Debug-Ausgabe?
Die Debug-Ausgabe zeigt:
{
hasBody: true/false,
body: {...},
bodySuccess: true/false,
bodyStatus: "...",
fullResponse: {...}
}Wenn bodySuccess nicht true ist, liegt ein Problem mit der Response-Struktur vor.