MB: ablage von öffentlichen Bildern im Framework

moin,

  • wo legt man upload-Bilder (z.B. Avatar, Bezugs Bilder) im Framework ab?
  • wo legt man Framework-Bilder (z.B. Logo, aussagekräftige Bilder) ab?

Ich hab mehr oder weniger alles in mehr oder weniger unübersichtlichem Ordner ./framework/public/ rein gepackt mit einer Datenbank-Referenz drauf. So muss ich nur den Bezug herstellen und nicht die eigentlichen Image-Objekte die ich aus der Datenbank rausholen müsste.

lgmb

  1. Tach!

    • wo legt man upload-Bilder (z.B. Avatar, Bezugs Bilder) im Framework ab?
    • wo legt man Framework-Bilder (z.B. Logo, aussagekräftige Bilder) ab?

    Ein Framework legt die Code-Grundlage für den Code der Anwendung. Das Framework ist damit eine der Code-Bibliotheken, die die Anwendung verwendet. Daten der Anwendung haben nichts mit dem Code des Frameworks oder dem Code anderer verwendeter Bibliotheken zu tun. Ansonsten legt man sie so ab, wie das für die Anwendung am sinnvollsten erscheint. Da gibt es keine grundlegenden Vorgehensweisen, abgesehen vonden üblichen sicherheitstechnisch zu beachtenden Dingen bei vom Anwender bereitgestellten Dingen, beispielsweise keinerlei Code-Ausführung im Upload-Verzeichnis.

    dedlfix.

  2. Hello,

    • wo legt man upload-Bilder (z.B. Avatar, Bezugs Bilder) im Framework ab?
    • wo legt man Framework-Bilder (z.B. Logo, aussagekräftige Bilder) ab?

    Grundsätzlich sollte man sowohl für das Upload-Verzeichnis, als auch für das öffentlich zugängliche Betriebsverzeichnis dafür sorgen, dass kein Code ausgeführt werden kann. Siehe hierzu die umfangreichen Gedanken zum File-Upload.

    Baust Du das Framework gerade selber, oder benutzt Du ein fertiges? Die fertigen haben leider auch oft Lücken gerade zu diesem Thema.

    Glück Auf
    Tom vom Berg

    -- Es gibt nichts Gutes, außer man tut es!
    Das Leben selbst ist der Sinn.
    1. moin,

      Baust Du das Framework gerade selber, oder benutzt Du ein fertiges? Die fertigen haben leider auch oft Lücken gerade zu diesem Thema.

      bin fast fertisch. Ich hab lauter vorgehensweise Fehler gemacht :'(. Ausfehlern lernt man. Deswegen habe ich dieses ja gemacht. War auch zu faul um zuerst UML zu machen und dann zu coden. Es rächt sich jetzt aber das war mir, wie ich mich selbst kenn, schon klar.

      lgmb

    2. Siehe hierzu die umfangreichen Gedanken zum File-Upload.

      Hm. Inzwischen zu groß (halbes Buch) geworden und unübersichtlich. Habe gerade am wiki-Eintrag herumgedoktort.

      Die Berechnung der maximalen Upload-Größe scheint nicht ganz trivial. Wie würdet Ihr das machen?

      <?php class ini_max_filesize { public $max_filesize = 0; public $upload_max_filesize = 0; public $post_max_size = 0; public $symbols = 'KMGTPEZ'; public $arSymbols = false; function __construct () { $this-> arSymbols = array_merge( [''], str_split( $this-> symbols ) ); $this -> upload_max_filesize = $this -> extval2integer( ini_get('upload_max_filesize') ); $this -> post_max_size = $this -> extval2integer( ini_get('post_max_size') ); if ( $this -> upload_max_filesize < $this -> post_max_size ) { $this -> max_filesize = $this -> upload_max_filesize; } else { $this -> max_filesize = $this -> post_max_size; } } function extval2integer ( $val ) { if ( 0 == (int)$val ) { return PHP_INT_MAX; } else { $symbol = strtoupper( preg_replace( '/[^' . $this -> symbols . ']/', '', $val )); return 1024 ** array_search( $symbol, $this -> arSymbols ) * (int)$val ; } } } ?> <input type="hidden" name="MAX_FILE_SIZE" value="<?= ( new ini_max_filesize() ) -> max_filesize; ?>">

      Resultat mit

      upload_max_filesize = 2M post_max_size = 8M

      in der php.ini:

      <input type="hidden" name="MAX_FILE_SIZE" value="2097152">
      1. Hallo ursus,

        vom Grundsatz her muss es wohl so ähnlich laufen. Was mir nicht klar ist: php.net schreibt, dass memory_limit hoch genug sein müsse. Echt jetzt? Muss ein POST erstmal komplett in dem RAM, bevor Files in Temp-Dateien geschrieben werden?

        Zum Bau als Klasse: Eine "heiße Kartoffel" Klasse (erzeugen, verwenden, schnell wieder fallen lassen) kann sinnvoll sein, wenn man für eine bestimmte Klasse von Operationen einen Arbeitskontext braucht. Wenn es nur genau eine Operation gibt, ist eine Funktion sinnvoller. Wenn Du außer der maximalen Größe für eine Datei die anderen Werte ebenfalls bereitstellen willst - okay, aber dann müsste man nochmal über den Klassennamen nachdenken.

        (2) Die Doppelhaltung der Symbole als String und Array ist merkwürdig, das geht schöner. Und du interpretierst zu viel, PHP kennt nur K, M und G. Alles andere sind Bytes.

        (3) PHP kennt eine min-Funktion. Die musst Du nicht von Hand realisieren.

        (4) Wenn man schon mit Regexen rangeht, kann man sie auch richtig nutzen. Ich habe mal benannte Gruppen eingesetzt und parse damit den INI-Wert in Zahl und Skalierbuchstabe. Das ermitteln des Skalierungswertes geht mit einem einfachen stripos, dafür brauche ich keine Array-Version der Skalierbuchstaben.

        (5) PHP_INT_MAX als Defaultwert ist meines Erachtens zu viel. Ein 64-bit PHP liefert hier 2^63-1, das ist im Exabyte-Bereich 😲.

        Meine Implementierung wäre (wobei ich upload_max_filesize und post_max_size ggf. nicht öffentlich machen würde, und der Einfluss von memory_limit mir noch unbekannt ist):

        class UploadLimits { public $max_filesize = 0; public $upload_max_filesize = 0; public $post_max_size = 0; function __construct () { $this->upload_max_filesize = $this->extval2integer( ini_get('upload_max_filesize') ); $this->post_max_size = $this->extval2integer( ini_get('post_max_size') ); $this->max_filesize = min($this->upload_max_filesize, $this->post_max_size); } private function extval2integer ( $val ) { $matches = []; $result = 0; $success = preg_match("/^(?<val>\d+)(?<sym>.?)/i", $val, $matches); if ($success > 0) { $scale = stripos("KMG", $matches["sym"]); $result = (int)($matches["val"]) * ($scale === FALSE ? 1 : 1024**($scale+1)); } return $result > 0 ? $result : 2**31; } }

        Rolf

        -- sumpsi - posui - clusi