Hallo,
ein Problem kommt selten allein ^^
Wie schaffe ich es denn Dateien am liebsten vor dem Upload umzubennen? Der Hook der in der Liste steht läuft ja nu im BE und nicht im FE
Hallo,
ein Problem kommt selten allein ^^
Wie schaffe ich es denn Dateien am liebsten vor dem Upload umzubennen? Der Hook der in der Liste steht läuft ja nu im BE und nicht im FE
Liebe Grüße
WebRoxx
Geht es dir um ein Frontend Upload Formular, dass du über den Formulargenerator erstellt hast? Wenn ja, dann kannst du im prepareFormData Hook die Datei automatisch umbenennen lassen und die Daten dementsprechend in $_SESSION['FILES'] aktualisieren.
Die save_callbacks aus dem DCA werden auch im Frontend Modul ausgeführt: https://github.com/contao/core/blob/...lData.php#L244
ALso ich habe da Felder die eigentkich nicht im DCA auftauschen, sondern nur für das "Persönliche Daten" MOdul gebraucht werden um drei Bilder hochzuladen.
Mit dem Hook ändere ich das dann wie folgt.
Läauft auch wie geschwünscht Jetzt wäre es nur schön wenn ich eine Datei-Synchronisation anstoßen könntePHP-Code:
....
for($i=0;$i<=2;$i++) {
$fileID = \FilesModel::findByPath($homeOrdner.'/'.$_SESSION['FILES']['fe_edb_files_'.$i]['name'])->id;
$path_parts = pathinfo($_SESSION['FILES']['fe_edb_files_'.$i]['tmp_name']);
$olfdname = TL_ROOT."/".$homeOrdner."/".$_SESSION['FILES']['fe_edb_files_'.$i]['name'];
$_SESSION['FILES']['fe_edb_files_'.$i]['tmp_name'] = TL_ROOT."/".$homeOrdner."/".$this->Member->company."_".$i.".".$path_parts['extension'];
$_SESSION['FILES']['fe_edb_files_'.$i]['name'] = $this->Member->company."_".$i.".".$path_parts['extension'];
rename($olfdname,$_SESSION['FILES']['fe_edb_files_'.$i]['tmp_name']);
//DB aktualisieren
$this->Database->prepare("UPDATE tl_files SET tstamp='".time()."', name=? WHERE id=?")->execute($_SESSION['FILES']['fe_edb_files_'.$i]['name'],$fileID);
}
....
Liebe Grüße
WebRoxx
Dafür gibt es die Funktion \Dbafs::moveResource($strSource, $strDestination). Selbst brauchst du da nichts in der Datenbank aktualisieren.PHP-Code:
$this->import('Files');
$this->Files->rename($source, $destination);
\Dbafs::moveResource($source, $destination);
das bringt jetzt die Meldung: Fatal error: Uncaught exception InvalidArgumentException with message Invalid resourcePHP-Code:
for($i=0;$i<=2;$i++) {
$fileID = \FilesModel::findByPath($homeOrdner.'/'.$_SESSION['FILES']['fe_edb_files_'.$i]['name'])->id;
$path_parts = pathinfo($_SESSION['FILES']['fe_edb_files_'.$i]['tmp_name']);
$oldname = TL_ROOT."/".$homeOrdner."/".$_SESSION['FILES']['fe_edb_files_'.$i]['name'];
$_SESSION['FILES']['fe_edb_files_'.$i]['tmp_name'] = TL_ROOT."/".$homeOrdner."/".$this->Member->company."_".$i.".".$path_parts['extension'];
$_SESSION['FILES']['fe_edb_files_'.$i]['name'] = $this->Member->company."_".$i.".".$path_parts['extension'];
//rename($olfdname,$_SESSION['FILES']['fe_edb_files_'.$i]['tmp_name']);
//DB aktualisieren
//$this->Database->prepare("UPDATE tl_files SET tstamp='".time()."', name=? WHERE id=?")->execute($_SESSION['FILES']['fe_edb_files_'.$i]['name'],$fileID);
$this->Files->rename($oldname, $_SESSION['FILES']['fe_edb_files_'.$i]['tmp_name']);
\Dbafs::moveResource($oldname, $_SESSION['FILES']['fe_edb_files_'.$i]['tmp_name']);
}
Pfade stimmen aber moveResource verschiebt doch die Dateien, das will ich ja eigentlich garnicht, der Pfad bleibt ja gleich nur der Name ändert sich
Liebe Grüße
WebRoxx
So sieht die aus.Code:Fatal error: Uncaught exception InvalidArgumentException with message Invalid resource /var/www/pfad-zur-datei/dateiname.jpg thrown in system/modules/core/library/Contao/Dbafs.php on line 60
Übergeben tut er den "alten absoluten Pfad" und den neuen.
Liebe Grüße
WebRoxx
Ah, die Dbafs Funktionen erwarten relative Pfade, nicht absolute.
Hmvergessen? Aber spielt ansonsten auch keine Rolle denke ich.PHP-Code:
$this->import('Files');
So bei meiner 4er installation scheint das so nicht mehr zu laufen
$this->Files->rename($rel_path, $homeOrdner.'/'.$fileName.".".$path_parts['extension']);
erzeugt volgend
[2018-03-26 15:28:22] app.CRITICAL: An exception occurred. {"exception":"[object] (Symfony\\Component\\Debug\\Exception\\FatalThrowa bleError(code: 0): Call to a member function rename() on null at /www/htdocs/website/packages/test-bundle/src/Classes/SendForm.php:45)"} []
und Files::rename($rel_path, $homeOrdner.'/'.$fileName.".".$path_parts['extension']);
[2018-03-26 15:26:20] app.CRITICAL: An exception occurred. {"exception":"[object] (Symfony\\Component\\Debug\\Exception\\FatalThrowa bleError(code: 0): Using $this when not in object context at /www/htdocs/website/vendor/contao/core-bundle/src/Resources/contao/library/Contao/Files.php:202)"} []
Liebe Grüße
WebRoxx
$this->Files geht nur wenn deine Klasse wo du das machen möchtest irgendwie von Contao\System erbt und du $this->import('Files') vorher gemacht hast. Hast du das gemacht?
Muss das Thema nochmal aufgreifen.
Habe auf einer geschützten Seite ein Formular mit mehreren Upload-Feldern.
Die Dateien werden in das Mitgliederverzeichnis gespeichert.
Da ich die Bilder später auf der Mitgliederseite auf einer fixen Position anzeigen lassen möchte muss das Bild fix benannt sein.
Trotz Anleitung für die Mitglieder werden die Bilder nicht immer richtig vor dem Upload umbenannt.
Wie schaffe ich es nun dass die hochgeladene Datei automatisch umbenannt wird und dann im Mitgliederverzeichnis landet?
Der Wunsch-Dateiname könnte ja direkt im form_upload Template hinterlegt sein (pro Upload ein Template).
Habe schon einige Threads durch und viel probiert, aber leider kein Erfolg.
Im Einsatz ist Contao 4.4. Danke für die Hilfe
Warum muss es ein fixer Dateiname sein? Du kannst dir doch einfach die Bilder holen/ausgeben lassen, die in einem gewissen Ordner sind.
Alle Bilder des Userverzeichnis in einer Galerie anzeigen geht leider nicht. Muss die einzelnen Bilder an verschiedenen Positionen im Template ausgeben.
Aktuell gebe ich die Fotos in der Mitgliederliste (mod_memberlist) so aus:
{{image::files/user/user_<?php echo $id; ?>/foto1.jpg?width=400&height=300}}
Wüsste nicht wie ich es ander als mit fixen Dateinamen lösen könnte.
Achso, aber es wäre doch für so einen Zweck viel sinnvoller wenn man die zum Mitglied gehörigen Bilder auch beim Mitglied auswählt.
Allerdings!
Hatte mir schon die Avatar Erweiterung (https://github.com/terminal42/contao-avatar) angesehen, aber hier kann man nur 1 Bild einbinden.
In meinem Fall sind es aber 7.
Hmmm...
Prinzipiell wäre das nur eine Erweiterung des DCA, mehr brauchst du nicht
Danke für den Tipp, dachte nicht dass sich das mit einer einfachen DCA Erweiterung machen lässt.
Meine Lösung sieht wie folgt aus (Contao 4.4).
Installation von Fineuploader
https://github.com/terminal42/contao-fineuploader
Erweiterung DCA:
Das einzige was noch nicht so optimal funktioniert...PHP-Code:
// Anpassung der Palette
$GLOBALS['TL_DCA']['tl_member']['palettes']['default'] = str_replace
(
'dateOfBirth',
'xt_upload,dateOfBirth',
$GLOBALS['TL_DCA']['tl_member']['palettes']['default']
);
// Hinzufügen der Feld-Konfiguration
$GLOBALS['TL_DCA']['tl_member']['fields']['xt_upload'] = array
(
'label' => &$GLOBALS['TL_LANG']['tl_member']['xt_upload'],
'exclude' => true,
'inputType' => 'fineUploader',
'eval' => array
(
'storeFile' => true,
'multiple' => false,
'uploadFolder' => 'files/uploads',
'useHomeDir' => true,
'uploaderLimit' => 1,
'addToDbafs' => false,
'extensions' => 'jpg,png',
'minlength' => 0,
'maxlength' => 4048000,
'maxWidth' => 5000,
'maxHeight' => 5000,
'imageWidth' => 5000,
'imageHeight' => 5000,
'doNotOverwrite' => false,
'uploadButtonLabel' => 'Datei auswählen',
'chunking' => false,
'maxConnections' => 1,
'directUpload' => true,
'imageSize' => [1000, 1000, 'proportional'],
'feViewable' => true,
'feEditable' => true,
'tl_class' => 'clr long'
),
'sql' => "blob NULL"
);
Uploads vom Mitglied im Frontend werden in HomeDir gespeichert.
Uploads vom Admin im Backend nach 'files/uploads'.
Es wäre natürlich besser wenn in beiden Fällen HomeDir verwendet wird, damit die Daten zentral gespeichert sind.
Das Home Directory ist ja für jedes Mitglied unterschiedlich. Der Admin muss daher dafür sorgen die Dateien in den richtigen Ordner zu laden.
Der Admin kann ja die Datei nicht in einen beliebigen Ordner (Home Directory des Mitglieds) hochladen und dann auswählen, der Upload Ordner ist ja fix.
Eine Möglichkeit ist die Frontend-Vorschau mit "Mitglied-Vorschau" zu öffnen und dann die Datei über das Frontend hochzuladen.
Die Datei wird ja in den vorgegeben Pfad hochgeladen.
Nur wenn man als Mitglied im Frontend die Datei hochlädt wird das Mitgliederverzeichnis als Upload-Pfad verwendet.PHP-Code:
'uploadFolder' => 'files/uploads',
Aber der Workaround für Admins funktioniert:
Frontendvorschau + Anzeige als Mitglied und dann uploaden
Hallo zusammen,
ich habe ein ähnliches Problem: Für Bewerbungen können Dateien in einem Formular hochgeladen werden. Diese Dateien werden dann zusammen mit den Formulardaten per Mail versendet. So weit funktioniert das auch, so lange Dateien vernünftig benannt sind. Im aktuellen Fall wurde eine Datei mit mehreren Kommas (Kommta) und einem Punkt im Dateinamen hochgeladen:
Bewerbung, Anschreiben, Lebenslauf, Zeugnisse V. Nachname.pdf
Diese Datei wird im System-Log als hochgeladen angezeigt, allerdings nur ins Temp-Verzeichnis, sie wurde nicht in den eigentlichen Upload-Ordner verschoben und deshalb wohl auch nicht an die Mail angehängt.
Testweise habe ich "V." aus dem Dateinamen entfernt. Wenn nur die Kommas im Namen stehen funktioniert es: Die Kommas werden in Unterstriche umgewandelt. Ich gehe also davon aus, dass es am Punkt liegt.
In Betrieb ist Contao 4.7 mit dem Drag & Drop Uploader von Terminal 42.
Frage: Gibt es eine Möglichkeit, auch die Punkte (außer dem letzten vor der Dateiendung) umzuwandeln ODER eine Meldung auszugeben, dass der Dateiname ungültig ist?
Vielen Dank und viele Grüße
Timo
Mir ist nicht ganz klar - vom Ausgangspost - welcher Hook denn nun verwendet wurde. PrepareFormData greift doch nicht für Anpassungen via Modul 'Persönliche Daten', oder? Zumindest bei mir nicht.
Und UpdatePersonalData wäre für die vorgängige Umbenennung ja zu spät und sehr umständlich, nicht?
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)