FabsH
I'm new here

Reales Verzeichnis eines MediaFolders auslesen

Jump to solution

Hallo zusammen,

über ein Formular gibt ein Redakteur ein Verzeichnis aus dem MediaStore an. Im HTML erhalte ich somit ein Objekt vom Typ TargetReference. Nun brauche ich für die weitere Verarbeitung jedoch das reale Verzeichnis auf dem Server (also z.B. /var/www/domainname/web/media/pictures/my-folder).

Wie stelle ich das am besten an?

Danke!

1 Solution

Accepted Solutions
FabsH
I'm new here

Tatsächlich habe ich es nun mit einer "custom"-Lösung umgesetzt. Ich verzichte komplett auf PHP und handle alles mit Javascript im Frontend. Hier habe ich ein Paket gefunden, mit dem man clientseitig zip-Dateien generieren und Downloaden kann.

In meiner Galerie werden die Bilddaten einmal als Thumbnail generiert über $CMS_REF(bild, res:"thumbnail") und einmal in der Originalauflösung:

$lt;img src="$CMS_REF(bild, res:"thumbnail")$" data-fullsize="$CMS_REF(bild, res:"original")$"$gt;

Das hat dein Vorteil, dass die Ladezeit auch bei vielen Bildern kurz gehalten wird.

Wird der Download gestartet, holt sich das Script in JS die url aus dem data-fullsize und kann somit die originale Auflösung für den Download verwenden.

View solution in original post

0 Kudos
5 Replies
bIT_sosswald
Returning Responder

Hallo Fabian,

eine erste Verständnisfrage: Wozu genau benötigst du den realen Pfad auf dem Zielserver? Je nachdem was du damit machen willst, gibt es ja evtl. eine elegantere Lösung als den Pfad direkt und vollständig anzugeben.

Das reale Verzeichnis auf dem Server wirst du nicht direkt auslesen können, da dieses ja je nach eurer Infrastruktur (Server, Webserver, etc.) variieren kann.

Du wirst also vermutlich nicht darum herumkommen dir irgendwo den "base path" zu konfigurieren und den realen Pfad dann selbst zusammenzubauen.

101818_pastedImage_0.png

Dies kann z.B. im Generierungsauftrag über das Feld "Präfix für absolute Pfade" geschehen. Dies ist aber eher für die Erzeugung von absoluten URLs gedacht und wird über den Parameter "abs:x" bei der Ausgabe über $CMS_REF()$ angesprochen.

Vermutlich ist es also besser den Pfad in den Projekteinstellungen zu konfigurieren und über z.B. ein Rendertemplate aus dem konfiguriertem Pfad die die Ausgabe zu steuern.

Beste Grüße

Sandro

0 Kudos

Hi Sandro,

das Ziel soll sein, dass ein User die Bilder in einer Galerie herunterladen kann. Die Galerie steht bereits (umgesetzt mit Bootstrap, jQuery etc). Nun soll die Galerie dahingehend erweitert werden, dass der User ein Bild, mehrere oder alle Bilder auswählen und herunterladen kann. Angedacht ist, dass der User nach der Auswahl der Bilder ein Formular abschickt und dieses serverseitig mit PHP verarbeitet wird.

Die Bilder einer Galerie liegen immer in einem Ordner. Eine Galerie wird also aus den Bildern eines Ordner generiert. Allerdings kann der Redakteur natürlich neue (Unter-) Ordner anlegen und für weitere Galerien nutzen. Aus diesem Grund brauche ich zumindest auf Projektebene das Verzeichnis zu den Bildern der aktuellen Galerie (also z.B. [web-root]/media/ordner-eins/unterordner/galerie-ordner).

Den Document-Root des Servers kann ich leicht mit PHP ermitteln, steht ja in der globalen $_SERVER-Variable. Nur von dort ausgehend tappe ich im dunkeln.

0 Kudos

Hallo Fabian,

wie gesagt, ich denke du kommst nicht um eine "custom" Lösung herum.

Aus der TargetReference bekommst du das Referenzierte Medium bzw. wenn die Referenz nur auf einen Ordner geht auch direkt den Ordner. TargetReference (FirstSpirit Access-API)

Von dort kannst du dir dann, je nach Implementierung des Downloadmechanismus, die URL des jeweiligen Mediums abrufen. (Mit und ohne Präfix)

Wenn du einen Ordner in der Hand hast, kannst du auch dessen (Referenz-)Name abrufen und über "ordner.getParent()" den Baum nach oben iterieren um dir den gesamten Pfad zusammenzubauen.

Je nach verwendetem URL Creator kann es auch sein, dass dir die Stored-URLs helfen, wenn diese gespeichert sein sollten.

Wenn es zwischen dem in der $_Server-Variablen gespeicherten Wert und dem Root deines Deployments aus FirstSpirit noch weitere Ebenen geben sollte, müsstest du die wie erwähnt vermutlich irgendwo im FirstSpirit konfigurieren und in deinen Pfad mit einbauen. Dazu bin ich jedoch zu wenig PHP Experte um das final beurteilen zu können. 😉

Grüße

Sandro

0 Kudos
mbergmann
Crownpeak employee

Hallo Fabian,

der eigene Aufbau der URLs gemäß der Ordnerstruktur in FS hat einen grundsätzlichen entscheidenden Nachteil: Du arbeitest hier am URL-Erzeugungsmechanismus vorbei bzw. baust ihn nach. Die Logik, welche URL (bzw. streng genommen welchen Pfad) ein Element erhält, sollte immer nur genau an einer Stelle vorhanden sein, nämlich in der Implementierung der jew. UrlFactory in Verbindung mit der Auswahl der verwendeten UrlFactory in den einzelnen Generierungsaufträgen. Alles andere wäre eine potentielle Fehlerquelle, da bei Nutzung einer anderen UrlFactory bzw. Änderung ihrer Implementierung dies immer nachgezogen werden müsste.

Von daher wäre mein Vorschlag, sich im Template einfach das erste Medium des referenzierten Ordners zu holen, zu referenzieren und aus dem Ergebnis den Pfad zu extrahieren. Wenn die FS_REFERENCE den Namen "st_folder" hat, z.B. so:

$CMS_SET(set_mediaUrl,ref(st_folder.get().getChildren(class("de.espirit.firstspirit.access.store.mediastore.Media")).first, abs:2).url)$

$CMS_SET(set_folderPath, set_mediaUrl.substring(0,set_mediaUrl.lastIndexOf("/")))$

$CMS_VALUE(set_folderPath)$

Je nach verwendeter UrlFactory bist Du streng genommen nichtmal hier auf der sicheren Seite. Falls ihr nämlich storedUrls verwendet und jemand ein Medium zu dem es schon eine storedUrl gibt, in einen Galerieordner verschiebt, wird das Bild (wegen der StoredUrl) in einen anderen Ordner generiert als seine Nachbarn.

Von daher wäre es wahrscheinlich sogar besser, alle URLs separat zu ermitteln und in eine Variable (JS oder PHP) zu schreiben, in etwa so:

Media paths:

<ul>

  $CMS_FOR(for_media,st_folder.get().getChildren(class("de.espirit.firstspirit.access.store.mediastore.Media")))$

     <li>$CMS_REF(for_media, abs:2)$</li>

  $CMS_END_FOR$

</ul>

Alternativ direkt passend in eine Liste:

$CMS_VALUE(st_folder.get()

  .getChildren(class("de.espirit.firstspirit.access.store.mediastore.Media"))

  .toList

  .map(media->ref(media, abs:2).url)

  .toJSON()

)$

Diese Infos (also die einzelnen Pfade) könnten dann dem PHP übergeben werden - das PHP nur auf einem Ordner arbeiten zu lassen ist aus den o.g. Gründen (storedUrls + Verschieben) fehleranfällig. Selbst falls ihr aktuell keine StoredUrls nutzt, wäre mir das zu heikel - wenn das in ein paar Monaten / Jahren mal geändert wird, funktioniert es nicht mehr und dann geht die Sucherei nach dem Fehler los 😉

Wichtig ist jeweils die Verwendung von abs:2, da Du ja absolute URLs erzeugen willst aber ohne den ggf. im Generierungstask eingetragenen Präfix.

Hinweis: Du müsstest letztlich sowieso dafür sorgen, dass alle entsprechenden Bilder im Ordner einmal per $CMS_REF referenziert werden - sonst würden sie bei der Generierung nämlich gar nicht erzeugt. Dieses Problem hast Du mit der zweiten Variante automatisch gelöst.

Viele Grüße

Michael

FabsH
I'm new here

Tatsächlich habe ich es nun mit einer "custom"-Lösung umgesetzt. Ich verzichte komplett auf PHP und handle alles mit Javascript im Frontend. Hier habe ich ein Paket gefunden, mit dem man clientseitig zip-Dateien generieren und Downloaden kann.

In meiner Galerie werden die Bilddaten einmal als Thumbnail generiert über $CMS_REF(bild, res:"thumbnail") und einmal in der Originalauflösung:

$lt;img src="$CMS_REF(bild, res:"thumbnail")$" data-fullsize="$CMS_REF(bild, res:"original")$"$gt;

Das hat dein Vorteil, dass die Ladezeit auch bei vielen Bildern kurz gehalten wird.

Wird der Download gestartet, holt sich das Script in JS die url aus dem data-fullsize und kann somit die originale Auflösung für den Download verwenden.

0 Kudos