Ergebnis 1 bis 16 von 16

Thema: Darstellung von Bildern aus geschützten Ordnern im Backend

  1. #1
    Contao-Nutzer
    Registriert seit
    21.10.2014.
    Beiträge
    41

    Standard Darstellung von Bildern aus geschützten Ordnern im Backend

    Hallo,

    ich bin mit einer (glaube eigentlich recht einfachen) Sache am verzweifeln. Folgendes Problem:

    Auf meiner Webseite können Mitglieder Passfotos hochladen, die zusammen mit weiteren Daten für Workshopanmeldungen benutzt werden. Das passiert über die Mitgliederordner, die geschützt sind. Schließlich soll ja nicht jeder auf diese Dateien Zugriff haben.

    Jetzt möchte ich eigentlich nur die Teilnehmer mit Passfotos in einem Backendmodul anzeigen bzw. dann auch ausdrucken können. Ich habe dazu eine Erweiterung im alten Stil unter system/modules angelegt. Ich wollte das ähnlich wie in der Dateiverwaltung machen und die Bilder entweder in den Cache legen oder in base64 umwandeln, um sie dann anzeigen zu können. Nur leider kann ich aus dem Skript heraus nicht auf die Dateien zugreifen.

    Ich suche mir die Datei per ID aus der Datenbank
    $objFile = \FilesModel::findById(...);

    $objFile->path stimmt dann auch aber:

    \Controller::getImage($objFile->path, 150, 250, 'proportional') liefert immer NULL zurück.
    file_get_contents($objFile->path) gibt auch bool(false) zurück

    Herunterladen wie mit dem Download Element klappt auch nicht:
    \Controller::sendFileToBrowser($objFile->path);

    Ich vermute mal, dass mein BE Modul Skript für den Server nicht als "intern" zählt, aber hier hört mein PHP Wissen dann leider auch auf.

    Wäre jedenfalls sehr dankbar, wenn hier jemand den entscheidenden Hinweis hätte.

    Vielen Dank im Voraus
    Geändert von Spooky (14.08.2018 um 08:40 Uhr) Grund: prefix

  2. #2
    Contao-Urgestein Avatar von fiedsch
    Registriert seit
    09.07.2009.
    Ort
    München
    Beiträge
    2.947

    Standard

    Wenn ich mir die letztlich aufgerufenen Image::get() anschaue, sehe ich, daß null zurückgegeben wird, wenn (der übergebene Pfad leer ist oder) etwas nicht funktioniert hat. Dann sollte aber auch ein System-Log-Eintrag generiert worden sein. Findest Du etwas im Log?
    Contao-Community-Treff Bayern: http://www.contao-bayern.de

  3. #3
    Contao-Nutzer
    Registriert seit
    21.10.2014.
    Beiträge
    41

    Standard

    Ja, ist so, als ob der Pfad falsch wäre:

    Image "files/ppe/Mitgliederordner/user_884/Testfoto.jpg" could not be processed: Image "files/ppe/Mitgliederordner/user_884/Testfoto.jpg" could not be found

  4. #4
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    34.254
    Partner-ID
    10107

    Standard

    Welche Contao Version?

  5. #5
    Contao-Nutzer
    Registriert seit
    21.10.2014.
    Beiträge
    41

    Standard

    4.5.6

  6. #6
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    34.254
    Partner-ID
    10107

    Standard

    Bitte immer das entsprechende Präfix angeben. Ich habe das nun für dich erledigt.

  7. #7
    Contao-Nutzer
    Registriert seit
    21.10.2014.
    Beiträge
    41

    Standard

    Wenn ich den Pfad gegen ein Bild in einem öffentlichen Ordner tausche, dann klappt es auch mit der get-Funktion.
    @Spooky: ok, danke

  8. #8
    Contao-Fan Avatar von PaddySD
    Registriert seit
    26.10.2016.
    Ort
    Andechs
    Beiträge
    656

    Standard

    Du kannst generell nicht auf Bilder aus einem geschützten Verzeichnis zugreifen. Contao verhindert das.

    Du musst an dieser Stelle einen anderen Weg gehen, denn die Darstellung im BE ist für Contao kein erlaubter Zugriff. Du musst da den Umweg über eine eigene Datei zur Darstellung gehen.

    Ich hab's ehrlich gesagt nicht mehr zu 100% auf dem Schirm, das ist leider schon zwei, drei Jahre her, dass ich das in einer Erweiterung hatte.

    1. In der php-Datei den Pfad holen, dabei an die UUID denken
      Code:
      $objPicture = \FilesModel::findByPk($objIdCards->picture);
    2. Im Template verlinkst Du kein direktes Bild, sondern eine Datei für die Bilddarstellung
      Code:
      <img src="image.php?img=<?php echo $idCard['picture']; ?>">
    3. Und das wäre der Inhalt der image.php (liegt in dem Fall im root von Contao)
      Code:
      $type = substr($_GET['img'],-3);
      header('Content-Type: image/' . $type);
      readfile('/var/www/virtual/xxx/html/files/pictures/' . $_GET['img']);


    Anders klappt das nicht. Und ehrlich gesagt, finde ich die Lösung ziemlich bääh, aber sie funktioniert. Ich hatte das damals auch bereits aufgegeben, bis ich zufällig über einen alten Beitrag von Nina gestossen bin, den ich aber leider nicht mehr finde...

    EDIT: Ach ja jetzt, da kommt langsam die Erinnerung wieder.
    Solange Du Dich in der php-Datei bewegst, bist Du noch "intern" unterwegs. Sobald Du aber im Template die Dateien aufrufst, bist Du nicht mehr innerhalb Contaos unterwegs, sondern quasi "ein Browser", der ganz normal versucht, das Bild zu ziehen, liegt ja aber im geschützten Verzeichnis.

  9. #9
    Contao-Nutzer
    Registriert seit
    21.10.2014.
    Beiträge
    41

    Standard

    Vielen Dank, das werde ich gleich mal ausprobieren!

  10. #10
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    34.254
    Partner-ID
    10107

    Standard

    Zitat Zitat von PaddySD Beitrag anzeigen
    Du kannst generell nicht auf Bilder aus einem geschützten Verzeichnis zugreifen. Contao verhindert das.
    Von außen. Aber er möchte ja nicht von außen darauf zugreifen, sondern über PHP. Der Fehler muss also woanders liegen.

  11. #11
    Contao-Nutzer
    Registriert seit
    21.10.2014.
    Beiträge
    41

    Standard

    Oh Mann, was bin ich für ein Idiot...

    Die Funktion passt wunderbar, aber meine Schleife hat falsche Dateinamen mit dem Ordnerpfad zusammengesetzt. Von wegen der Pfad passt sicher.
    War wohl schon zu spät gestern, sorry für Umstände.

    Picard-no-facepalm.jpg

  12. #12
    Contao-Fan Avatar von PaddySD
    Registriert seit
    26.10.2016.
    Ort
    Andechs
    Beiträge
    656

    Standard

    Zitat Zitat von Spooky Beitrag anzeigen
    Von außen. Aber er möchte ja nicht von außen darauf zugreifen, sondern über PHP. Der Fehler muss also woanders liegen.
    Na ja, von aussen ist immer so eine Frage... In meinem Fall sind das Bilder die auf einen Ausweis gedruckt werden. Ich bin zwar innerhalb des BE, aber wenn es ans Template geht, ist man "aussen". Die geschützten Dateien werden schlicht nicht dargestellt.

    Über diesen Umweg geht's. Wobei natürlich im Fall des TE das nicht das Problem war.

    @androsch
    Ist doch gut, Hauptsache gefunden!

  13. #13
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    34.254
    Partner-ID
    10107

    Standard

    Zitat Zitat von PaddySD Beitrag anzeigen
    Na ja, von aussen ist immer so eine Frage... In meinem Fall sind das Bilder die auf einen Ausweis gedruckt werden. Ich bin zwar innerhalb des BE, aber wenn es ans Template geht, ist man "aussen". Die geschützten Dateien werden schlicht nicht dargestellt.
    Schon klar. Eben aus diesem Grund hatte er sich ja bereits PHP code geschrieben, um das Bild entweder über assets/ oder direkt über PHP an den Browser zu schicken. Sein Problem war ja nicht, dass die Darstellung des Bildes im Backend nicht funktioniert, sondern (schon davor) dass
    PHP-Code:
    \Controller::getImage($objFile->path150250'proportional'); 
    null liefert. Weil der eben der Pfad, den er benutzt hatte, letztendlich doch falsch war

  14. #14
    Contao-Fan Avatar von PaddySD
    Registriert seit
    26.10.2016.
    Ort
    Andechs
    Beiträge
    656

    Standard

    Jetzt muss ich dann aber doch nachfragen:

    Wie schickst Du denn ein Bild an assets? Ich finde die Lösung von mir ja auch nur "einen Weg", schön ist anders. Von den Sicherheitsbedenken mal ganz zu schweigen...

    Mein Problem, warum ich das so gelöst habe, beginnt nämlich früher. Um eine "leere" Seite im BE zu bekommen, muss ich zwangsweise ans Template gehen, und da beisst es aus. Leere Seite deshalb, weil ich dort eben alle meine gespeicherten Ausweisdaten brauche, inklusive Bild. Daraus direkt den Druck anzustossen macht aber nur Sinn, wenn keine "BE-Sachen" angezeigt werden, also eine "leere" Seite.

  15. #15
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    34.254
    Partner-ID
    10107

    Standard

    Zitat Zitat von PaddySD Beitrag anzeigen
    Wie schickst Du denn ein Bild an assets?
    So wie es androsch gemacht hat. Er hat sich über
    PHP-Code:
    \Controller::getImage($objFile->path150250'proportional'); 
    eine kleinere Bildversion erzeugt. Nachteil davon ist natürlich auch, dass dieses erzeugte Bild dann natürlich von jedem eingesehen werden könnte, wenn man die URL kennt.

  16. #16
    Contao-Nutzer
    Registriert seit
    21.10.2014.
    Beiträge
    41

    Standard

    Danke nochmal für eure Hilfe, ich habe das inzwischen so gelöst:

    PHP-Code:
    ...
    $objFile = \FilesModel::findById($id);
    if (
    $objFile) {
      
    $img file_get_contents(TL_ROOT "/" $objFile->path);
      
    $image imagecreatefromstring($img);
      
    $image imagescale($image 200);
      
    ob_start();
      
    imagejpeg($image);
      
    $contents ob_get_contents();
      
    ob_end_clean();
      
    $imdata base64_encode($contents);
      
    imagedestroy($image);
      
    $arrFotos[$teilnehmer->id]['img'] = '<img width=200 src="data:image/x-icon;base64,' $imdata '">';
    }
    ... 
    Ich hole mir das Bild, skaliere es erst auf 200px Breite und baue dann daraus ein base64 image ($arrFotos lad ich dann ins Template). Natürlich könnte man das Bild mit dem Code dann auch einfach so aufrufen, aber zumindest liegts nicht im Bildercache.

Aktive Benutzer

Aktive Benutzer

Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)

Lesezeichen

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •