Ankündigung

Einklappen
Keine Ankündigung bisher.

Ordnerupload - Dateiname alle 50 Dateien um eine forlaufende Nummer ergänzen

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Ordnerupload - Dateiname alle 50 Dateien um eine forlaufende Nummer ergänzen

    Hallo nun bin ich mal wieder da habe schon viele Fortschritte gemacht aber nun ein doofes Problem.



    Ich habe mir eine Fotogalerie erstellt. Alles funktioniert an sich ganz gut.

    Ich kann über den Browser bis zu 20 Dateien hochladen.

    Was ich mit Google Chrome getestet habe. und mit filezilla in einen Vordefinierten Ordner mit Namen “uploads” bekomme ich es auch hin, das der Inhalt des Ordners hochgeladen wird.

    Die Dateien werden jeweils in ein Bilderordner gespeichert und Thumbs werden erstellt und in einem Thumbnail Ordner gespeichert, beide Pfade also Bild und Thumbnail werden in einer mysqldb gespeichert.

    Aber da kommt mein Problem. ich will beim Ordner Upload von mehr als 50 Dateien den Dateinamen alle 50 Bilder, die in die Datenbank eingetragen werden und im Bilderordner gespeichert. werden, umbenennen indem ich eine laufende Nummer anhänge.

    Ist das mit der, ich nenne es mal internalen Variable $files() möglich vom Grundsatz her oder kann ich das nicht beeinflussen beim move Befehl?
    Ich kann ja im Grunde da auch beeinflussen den Dateinamen zu Ändern wenn die Datei schon vorhanden ist.

    Die Umbenennung muss halt vor dem Eintrag in der Datenbank und dem upload passieren.

    Folgendes Script ist für den Upload zuständig.
    Per Postcheck katalogisiere ich die Dateien/Bilder was ich bei der Ausgabe als Kriterien nutze und aus einem Formular stammen.
    Beispiel :

    Kategorie > Urlaub
    Album > Tunesien
    Subalbum > Tag 1

    Ab Bild 51 im Uploadordner soll es wie folgt in die DB eingetragen werden:

    Kategorie > Urlaub
    Album > Tunesien
    Subalbum > Tag 1_1

    Ab Bild 101 im Uploadordner soll es wie folgt in die DB eingetragen werden:

    Kategorie > Urlaub
    Album > Tunesien
    Subalbum > Tag 1_2

    usw.

    Meine Frage bezieht sich nur um die sequentelle Umbenennung.
    Es handelt sich noch um ein Vorabscript.
    Sicherheitstechniche Sachen werden erst später von mir korrigiert.
    Auch wenn später keiner mehr so richtig klar kommt weil zu kompliziert geschrieben werde ich einen Weg finden es sauber zu dokumentieren oder umzuschreiben.
    Also bitte helft mir bei meiner Frage und lasst erst mal mein grottenschlechtes Script welches zwar funktioniert aber wahrscheinlich noch einiges an Verbesserung braucht so sein wie es ist.
    Denn mein Problem ist das ich alleine per learning by doing das alles aufgebaut habe und bei anderen Sachen die ihr einwerfen könntet den Faden wieder verliere.
    Wie schon bei anderen Beiträgen von mir habe ich erwähnt das ich newbie bin und aus arbeitstechnischen Gründen mir leider die Zeit davon läuft. Ich lerne durch probieren, habe aber hier keine Antwort,

    PHP-Code:
    <?php
    //PHP Start
     
    error_reporting(E_ALL);
     
    ini_set('display_errors'TRUE);
     require_once 
    'includes/connect.php';
     require_once 
    'includes/functions.inc.php';
     require_once 
    'gallery_inc/gallery_ini.php';
     
    $user check_user();
     
    $seitenname 'Ordnerupload';
     require_once 
    'header.php';
     
    // Postcheck
       
    if(!empty($_POST["kategorie"])) {$val_kategorie $_POST["kategorie"];} else {$val_kategorie "";}
       if(!empty(
    $_POST["album"]))   {$val_album $_POST["album"];} else {$val_album "";}
       if(!empty(
    $_POST["subalbum"])) {$val_subalbum $_POST["subalbum"];} else {$val_subalbum "";}
     
    // Postcheck ende

     // Dateien aus Ordner hochladen
       
    $_FILES array_slice(scanDir($upload_dir), 2);
       
    $anz_uploads count($_FILES);
       for (
    $i 0$i count($_FILES); $i++)
         {
           
    // Info über die Datei holen
             
    $path $upload_dir $_FILES[$i];
             
    $tmp_bild $path;
             
    $newpath $bilder_dir;
             list(
    $tmpWidth$tmpHeight$tmpType) = getImageSize($path);
             
    $set_filename explode("."$_FILES[$i]);
             
    $filename $set_filename[0];
             
    $extension strtolower($set_filename[1]);
             
    $fn_filter utf8_decode($filename);
             
    $fn_trim trim($fn_filter);
             
    $fn_lower mb_strtolower($filename);
             
    $fn_rewritechars str_replace(["ä""ö""ü""ß"" ",], ["ae""oe""ue""ss""_",], $fn_lower);
             
    $fn_result preg_replace("/[^a-z0-9_-]/"''$fn_rewritechars);
             
    $bildname substr($fn_result0$maxFilename) . "." $extension;
             
    $thumb_name 'tumb_' $bildname;
           
    // Info über die Datei holen ende
           // Datumsausgabe generieren
             
    $exif exif_read_data($tmp_bild0true);
               if (isset(
    $exif['EXIF']['DateTimeOriginal']))
                 {
                   
    $datum $exif['EXIF']['DateTimeOriginal'];
                 }
               else
                 {
                   
    $datum date("d.m.Y");
                 }
             
    $day_val $datum;
             
    $toDay strtotime("+0 day"strtotime($day_val));;
             
    $createdate date("d.m.Y"$toDay);
             
    $tag date("d"$toDay);
             
    $monat date("m"$toDay);
             
    $jahr date("Y"$toDay);
           
    // Datumsausgabe generieren Ende
           // Dateinamen und Pfad formatieren
             
    $bilddatei $bilder_dir $bildname;
             
    $thumbdatei $thumb_dir 'tumb_' $bildname;
             
    $uploaddatei $path;
           
    // Dateinamen und Pfad formatieren ende
           // Datenbankeinträge
             
    $insert $db->prepare
               
    ("INSERT IGNORE INTO `gal_bilder` SET
               `bilddatei` = :bilddatei,
               `thumbdatei` = :thumbdatei,
               `bildname` = :bildname,
               `kategorie` = :kategorie,
               `album` = :album,
               `subalbum` = :subalbum,
               `createdate` = :createdate,
               `tag` = :tag,
               `monat` = :monat,
               `jahr` = :jahr,
               `width` = :width,
               `height` = :height"
    );
             if (
    $insert->execute
               
    ([
               
    ':bilddatei' => $bilddatei,
               
    ':thumbdatei' => $thumbdatei,
               
    ':bildname' => $bildname,
               
    ':kategorie' => $val_kategorie,
               
    ':album' => $val_album,
               
    ':subalbum' => $val_subalbum,
               
    ':createdate' => $createdate,
               
    ':tag' => $tag,
               
    ':monat' => $monat,
               
    ':jahr' => $jahr,
               
    ':width' => $tmpWidth,
               
    ':height' => $tmpHeight
               
    ]))
             {
               
    // Erzeugung Thumbnail
                 // Dateiformat
                   
    switch ($extension)
                     {
                       case 
    'jpg':
                       
    $create imageCreatefromJPEG($tmp_bild);
                       break;
                       case 
    'png':
                       
    $create imageCreatefromPNG($tmp_bild);
                       break;
                       case 
    'gif':
                       
    $create imageCreatefromGIF($tmp_bild);
                       break;
                       case 
    'webp':
                       
    $create imageCreatefromWEBP($tmp_bild);
                       break;
                     }
                 
    // Breite und Höhe des Bildes ermitteln
                   
    $imageW $tmpWidth;
                   
    $imageH $tmpHeight;
                 
    // Thumbnail Abmessungen reduzieren
                   
    if ($imageW $imageH)
                     {
                       
    $thumbW $thumbWidth;
                       
    $thumbH $imageH $imageW $thumbWidth;
                     }
                   if (
    $imageW $imageH)
                     {
                       
    $thumbH $thumbHeight;
                       
    $thumbW $imageW $imageH $thumbHeight;
                     }
                   if (
    $imageW == $imageH)
                     {
                       
    $thumbW $thumbWidth;
                       
    $thumbH $thumbHeight;
                     }
                 
    // Thumbnail Abmessungen reduzieren ende
                 // Thumbnail mit neuen Abmessungen kopieren
                   
    $thumbnail imageCreateTruecolor($thumbW$thumbH);
                   
    imageCopyResampled($thumbnail$create0000$thumbW$thumbH$imageW$imageH);
                 
    // Thumbnail speichern und den Grafikspeicher löschen
                   
    imageJPEG($thumbnail$thumb_dir $thumb_name$thumbQuality);
                   
    imageDestroy($thumbnail);
               
    // Erzeugung Thumbnail Ende
             
    }
           
    // Datenbankeinträge ende
           // Fertige Dateien verschieben
             
    rename($uploaddatei$bilddatei);
             
    $uploadresult $anz_uploads;
           
    // Fertige Dateien verschieben ende
           // Erfolgsmeldung erstellen
             
    if ($anz_uploads 0)
               {
                 
    $erfolgout $anz_uploads.' von '.$anz_uploads;
                 
    $output =
                     
    '
                       <div class="col-10 my-4 mx-auto menu" style="color:#00ff00; border:5px #00ff00 solid; border-radius:15px">
                       <div class="col-10 my-4 mx-auto p-3 text-center" style="color:#00ff00; border:5px #00ff00 solid; border-radius:15px">
                       <h3>Es wurden ' 
    $erfolgout ' Dateien erfolgreich in den Bilderordner verschoben! </h3>
                       </div>
                       </div>
                     '
    ;
               }
             else
               {
                 
    $output =
                     
    '
                       <div class="col-10 my-4 mx-auto menu" style="color:#ff0000; border:5px #ff0000 solid; border-radius:15px">
                       <div class="col-10 my-4 mx-auto p-3 text-center" style="color:#ff0000; border:5px #ff0000 solid; border-radius:15px">
                       <h3>Es sind keine Dateien im Uploadordner vorhanden!</h3>
                       </div>
                       </div>
                     '
    ;
               }
           
    // Erfolgsmeldung erstellen ende
         
    }
     
    // Dateien aus Ordner hochladen ende
     
    echo $output;
    require_once 
    'footer.php';
    ?>
    <script>
     setTimeout("location.href='bilder_anzeige.php'",3000);
    </script>
    Hier mal ein Link zu meiner Testseite : http://alex-b-gallery.atwebpages.com/index.php

    Und hier ein Link zu den Dateien (in ZIP gepackt mit Anleitung um es evtl mit xampp oder ähnliches zu testen, weiter zu nutzen what ever"


    https://www.alex-b-test.de/downloads/gallerydateien.zip

  • #2
    dein timeout unten verstehe ich nicht, du willst doch die bilder hochladen und warten bis das fertig ist.
    aber zu dem problem:
    Aber da kommt mein Problem. ich will beim Ordner Upload von mehr als 50 Dateien den Dateinamen alle 50 Bilder, die in die Datenbank eingetragen werden und im Bilderordner gespeichert. werden, umbenennen indem ich eine laufende Nummer anhänge.

    Ist das mit der, ich nenne es mal internalen Variable $files() möglich vom Grundsatz her oder kann ich das nicht beeinflussen beim move Befehl?
    Ich kann ja im Grunde da auch beeinflussen den Dateinamen zu Ändern wenn die Datei schon vorhanden ist.
    du nutzt remane, es geht auch:
    https://www.php.net/manual/de/functi...oaded-file.php

    die namen der dateien im deinem ordner sind letzlich egal, wie du die bilder mal genannt hast steht ja in der db - dort können die namen sicher mehrmaöls vergeben werden bsp. "selfie" .
    in dem dateisystem kann das ding dann nur noch md5(file) oder md5(fiel). time genannt werden. sogar die endung ist unnötig.

    Kommentar


    • #3
      Zitat von tomBuilder Beitrag anzeigen
      dein timeout unten verstehe ich nicht, du willst doch die bilder hochladen und warten bis das fertig ist.
      nen die namen sicher mehrmaöls vergeben werden bsp. "selfie" .
      in dem dateisystem kann das ding dann nur noch md5(file) oder md5(fiel). time genannt werden. sogar die endung ist unnötig.
      Das ist auch nur um nach dem Upload auf die Anzeigeseite weiter zu leiten. Im Grunde irrelevant bezüglich meines Problemes.

      Zitat von tomBuilder Beitrag anzeigen
      die namen der dateien im deinem ordner sind letzlich egal, wie du die bilder mal genannt hast steht ja in der db - dort können die namen sicher mehrmaöls vergeben werden bsp. "selfie"
      Das ist mit ja klar, deswegen hab ich ja die DB Variante gewählt.

      Die Dateien werden aus dem Uploadordner(Quelle) in den Bilderordner (Ziel) verschoben mit ihrem hochgeladenen ursprünglichen Dateinamen.
      Der Programablauf ist so:
      1. Formular
        • Benennung Kategorie abfragen.
        • Benennung Album abfragen.
        • Benennung Subalbum abfragen.
      2. Alle Eingaben gemacht? Nein: Formular wird nicht abgesendet Ja : Mit
        PHP-Code:
        array_slice(scanDir($upload_dir), 2); 
        die im Ordner "uploads" enthaltenen Dateien in dem array " $_FILES" speichern".
      3. Mithilfe des Arrays mit einer Schleife Dateiinfos bearbeiten, Thumbnails erstellen.
      4. Fertige Infos in die DB eintragen.
        PHP-Code:
                 if ($insert->execute
                       
        ([
                       
        ':bilddatei' => $bilddatei,
                       
        ':thumbdatei' => $thumbdatei,
                       
        ':bildname' => $bildname,
                       
        ':kategorie' => $val_kategorie,
                       
        ':album' => $val_album,
                       
        ':subalbum' => $val_subalbum,
                       
        ':createdate' => $createdate,
                       
        ':tag' => $tag,
                       
        ':monat' => $monat,
                       
        ':jahr' => $jahr,
                       
        ':width' => $tmpWidth,
                       
        ':height' => $tmpHeight
                       
        ])) 
      5. Dateien vom Uploadordner in den Bilderordner verschieben, ich nutze den Befehl "rename" was nicht das Problem ist da der Pfad ja in der DB steht.
      6. Wenn Upload fertig auf die Anzeigeseite Weiterleiten, (ich weis nicht wie ich die Werte aus $val_kategorie, $val_album, $val_subalbum mitübergebe, vielleicht werde ich diese noch in einer session speichern und im Anzeigeskript per if !empty als value in die Inputs einpflege, Aktuell muss ich die noch mal wählen.

      Soweit der Ordnerupload.

      Das klappt ja auch wunderbar.

      Jedoch wenn ich auf die Bilderanzeigeseite gehe und das anzuzeigende Album wähle (ich definiere ja Kategorie,Album und Unteralbum im Upload und frage nach diesem Schema das gewünschte Album ab.

      Also wie oben Schon beschrieben:
      Beispiel beim Upload werden folgende Einträge für die Datenbank gewählt:

      Feldname > Eintrag
      Kategorie > Urlaub
      Album > Tunesien
      Subalbum > Tag 1


      Weiterer Upload
      Beispiel:

      Feldname > Eintrag
      Kategorie > Urlaub
      Album > Tunesien
      Subalbum > Tag 2


      usw.
      Dann z.B.

      Kategorie > Urlaub
      Album > Ohio
      Subalbum > Tag 1


      usw.

      Werden Bilderpfade mit Kategorie Album und Subalbum je Bild einer ID zugewiesen sprich in einer Reihe geschrieben-

      Wähle ich dann im Anzeigeformular

      Feldname > Eintrag
      Kategorie > Urlaub
      Album > Tunesien
      Subalbum > Tag 1



      werden alle Dateipfade dieFeldname > Inhalt
      Kategorie > Urlaub
      Album > Tunesien
      Subalbum > Tag 1


      enthalten angezeigt.

      Ausschlaggeben is also das Subalbum welches das eigentliche anzuzeigende Album ist

      Habe ich jedoch in Diesem Subalbum zu viele hochgeladen, so erhöht sich die Ladezeit der Seite extrem.

      Kopiere ich nun z.B. 500 Dateien im Uploadordner und weise dem, wie im obigen Beispiel beschrieben,folgende Kriterien zu:

      Kategorie > Urlaub
      Album > Ohio
      Subalbum > Tag 1


      werden bei der Anzeigeauswahl im Bilderanzeigescript ja alle 500 Dateien in den Speicher geladen.

      Da ich ja bei der Anzeige nicht auf eine Lösung zurückgreifen will, in der ich die anzuzeigenden Bilder auf mehrere Seiten verteile und per Seitenavigation auf eine gewisse Anzahl beschränke
      will ich dieses schon beim upload beschränken in der Form dass alle 51. Datei sich der Eintrag in der Datenbank im Feld Subalbum um eine laufende Nummer ergänzt wird.

      Also

      Kategorie > Urlaub
      Album > Ohio
      Subalbum > Tag 1
      Bild1jpg


      . . .

      Kategorie > Urlaub
      Album > Ohio
      Subalbum > Tag 1
      Bild50jpg


      Dann

      Kategorie > Urlaub
      Album > Ohio
      Subalbum > Tag 1_1
      Bild51jpg


      . . .

      Kategorie > Urlaub
      Album > Ohio
      Subalbum > Tag 1_1
      Bild101.jpg


      usw.

      Wie ich die benötigte Periodenanzahl und die Menge des Überschusses ermittle habe ich wie im folgendem Skript gelöst:

      PHP-Code:
      $anz_dateien=516;
      $anz_perioden 0;
      $step_dateien 50;
      $restbetrag 0;
      $restbetrag_ergebnis 0;
      $tmp_eintrag="Tag 1";

      if (
      $anz_dateien $step_dateien)
      {
          
      $anz_perioden floor($anz_dateien $step_dateien);
      }
      else
      {
          
      $anz_perioden 1;
      }

      if (
      $anz_perioden>1)
      {
          
      $restbetrag $anz_perioden $step_dateien;
          
      $restbetrag_ergebnis $anz_dateien $restbetrag;

      }
      else
      {
          
      $restbetrag 0;
          
      $restbetrag_ergebnis 0;

      Ergebniss wäre:

      anz_perioden = 10
      restbetrag = 16

      Meine Frage wie bringe ich das in mein script ein

      Kommentar


      • #4
        wie gesagt, es ist letzlich egal wo die dateien stehen.
        du suchst in deinder datenbank

        -alle uirlaube erster tag
        -ohio alle tage
        -oder usa immer der erste tag
        -oder was auch immer

        und bekommst eine masse an bidlern, sagen wir mal 500
        du suchst nach allen sefies und bekommst 10k

        da sag ich, du bist fleissig.

        du willst aber nicht alle bilder sofort laden ?

        dann nutze lazy loading :


        https://imagekit.io/blog/lazy-loadin...omplete-guide/


        das heisst ein bild wird erst dann geladen wenn es für den benutzer sichtbar ist.

        die idee mit den ordnern halte ich für suboptimal, da du ja früher oder später eh durch abfragen gegen die db entscheidest, welhe bilder zu laden sind.
        ps: bitte lass das türkis., es ist nett gemeint aqber suoer schwer zu lesern.

        Kommentar


        • #5
          Zitat von Satansmagic Beitrag anzeigen
          Da ich ja bei der Anzeige nicht auf eine Lösung zurückgreifen will, in der ich die anzuzeigenden Bilder auf mehrere Seiten verteile und per Seitenavigation auf eine gewisse Anzahl beschränke
          will ich dieses schon beim upload beschränken in der Form dass alle 51. Datei sich der Eintrag in der Datenbank im Feld Subalbum um eine laufende Nummer ergänzt wird.
          Womit die Bilder auch wieder auf einer extra Seite landen - da halte ich eine Funktion zum Blättern innerhalb eines "Subalbums" für wesentlich übersichtlicher (oder eben die schon genannte lazy-loading-Funktion).

          Und ja, ich weiß, du willst das nicht hören, aber mit dem aktuellen Code läufst du direkt in eine Sackgasse:
          1. wie ich dir letztes Jahr schon schrieb solltest du dich als erstes um ein anständiges Datenbankdesign kümmern. Eine Tabelle reicht hier nicht um alles sauber zu speichern: die Alben gehören in eine eigene Tabelle und in die Bilder-Tabelle dann nur noch die ID des Albums. Und was ist wenn du irgendwann mal feststellst dass zwei Alben-Ebenen nicht mehr reichen? Ein Bild gehört in ein Album und dieses Album kann wiederrum ein übergeordnetes Album haben - diese Information steht dann aber in der Album-Tabelle, nicht in der Bilder-Tabelle.
            Die Spalte "createdate" ist auch Käse: ein Datum gehört immer in eine Spalte vom Type DATE, die Spalten tag, monat und jahr sind überflüssig und können ersatzlos entfallen (der Typ "mediumtext" ist ohnehin völlig falsch).
            Für Breite und Höhe ist int (ohne "(11)", das ist falsch, k.A. womit du die Tabelle exportiert hast) auch etwas sehr großzügig dimensioniert, ein SMALLINT UNSIGNED (oder wegen mir MEDIUMINT UNSIGNED) reicht da völlig - generell solltest du dir etwas mehr Gedanken über die richtigen Spaltentypen und deren Größe machen. Ja, Speicher kostet heutzutage quasi nichts mehr, sich über das richtige Datenbankdesign (und damit auch über die passenden Spaltengrößen) Gedanken zu machen soll schon sein. Auch das "NOT NULL" in jeder Spalte erscheint mir wenig sinnvoll: zumindest bei fav_flag scheint mir NULL auch durchaus sinnvoll zu sein (bei anderen Spalten evlt. auch)
            Außerdem: in der Tabelle fehlt AUTO_INCREMENT für die id-Spalte, deswegen haben alle Bilder die ID 0 (zumindest in der "Installationsanweisung" in der zip-Datei)
          2. du baust zwei Verbindungen zur Datenbank auf, einmal PDO und einmal MySQLi - entscheide dich für eine (ich würde PDO empfehlen). Zudem wird die PDO-Verbindung gleich zweimal aufgebaut: einmal in $pdo und einmal in $db - beides mal falsch, es fehlt jeweils »;charset=utf8mb4« im DSN.
          3. dein Code enthält böse Sicherheitslöcher: du behandelst den Kontextwechsel nicht. Und nein, sowas erledigt man nicht "hinterher", da wird das dann ohnehin nie erledigt - sowas *muss* gleich richtig gemacht werden!
          4. dein Gewurschtel mit den Datumsangaben wird dir auch irgendwann noch auf die Füße fallen, vergiss den Umweg über Timestamps und arbeite intern immer mit DateTime-Objekten bzw. mit dem yyyy-mm-dd-Format. Für die Ausgabe gibt es IntlDateFormatter (wenn z.B. Monate ausgeschrieben werden sollen, sonst reicht (DateTime::format()) z.B. in Javascript toLocaleDateString
          5. das erzeugte HTML ist auch furchtbar: div-Suppe vom Feinsten, garniert mit Horden von Klassen und Layouttabellen sowie weiteren falsch eingesetzten Elementen (z.B. Überschriften!). Von der Bedienbarkeit mal ganz zu schweigen, aber da hattest du ja letztes Jahr schon etwas merkwürdige Vorstellungen/Vorlieben …
          6. dein Code zum Runterrechnen der Bilder is nicht so ganz ideal: auch die "großen" Bilder sehen ziemlich übel aus, 80% ist da als Qualität wohl etwas wenig. Genau kenne ich mich da auch nicht aus, aber Bilder sollten für hochauflösende Displays wohl die doppelte Pixelzahl haben als die in der sie dann dargestellt werden - vielleicht informierst du dich in die Richtung erstmal bevor du alles runterrechnen lässt
          7. Alle Bilder bzw. Thumbnails in je ein Verzeichnis zu packen ist evtl. nicht ideal wobei ich als Dateiname auch nur die ID des Bildes verwenden würde o.ä. - gespeichert werden müssen dann die Werte der Spalten bilddatei, thumbdatei und bildname nicht mehr da diese Werte automatisch erzeugt werden können.
          Ja, das ist alles viel und auch z.T. aufwendig umzusetzen - jetzt erstmal so weiter zu wurschteln und die Änderungen erst später zu machen ist aber noch viel aufwendiger …

          Kommentar


          • #6
            Ich nehme meistens sowas hier zum internen Speichern von Dateien:

            PHP-Code:
            <?php
            function generateStorePath(SplFileInfo $filestring $idint $padLen=21) {
                return 
            rtrim(chunk_split(str_pad($id$padLen"0"STR_PAD_LEFT),"3"DIRECTORY_SEPARATOR), DIRECTORY_SEPARATOR).".".$file->getExtension();
            }

            $file = new SplFileInfo(__FILE__);
            $id 5;
            echo 
            generateStorePath($file$id).PHP_EOL;
            // 000/000/000/000/000/000/005.php

            $id 8484305;
            echo 
            generateStorePath($file$id).PHP_EOL;
            // 000/000/000/000/008/484/305.php

            $id PHP_INT_MAX;
            echo 
            generateStorePath($file$id).PHP_EOL;
            // 009/223/372/036/854/775/807.php
            Das ist einfach, aber effektiv. Und durch ein vielfaches von 3 sieht das dann sogar einigermaßen "gleichförmig" aus und es werden maximal 1000 Dateien pro Verzeichnis gespeichert (damit ls nicht zu viel zu tun kriegt . Der "echte" Dateiname wird dann nur in der Datenbank gespeichert und ich spare mir Umlautprobleme. Die Extension könnte man theoretisch auch weglassen, allerdings finde ich die hilfreich, wenn man die Datei mal so auf dem Server öffnen will. Mehr als 2 Milliarden Dateien werden es auch nie, daher kommst du eigentlich auch locker mit 12, 15 oder 18 als $padLen aus - dann werden es nicht so viele Unterverzeichnisse
            Tutorials zum Thema Technik:
            https://pilabor.com
            https://www.fynder.de

            Kommentar


            • #7
              ab welcher anzahl von files/dir siehst du signifikate einschränkungen im zugriff ? Andreas

              Kommentar


              • #8

                Die Bilder weden mit eben den Kriterien: Kategorie, Album und Subalbum über das Anzeigeformular aufgerufen.
                Und da ist das Problem, wären es 500 Bilder mit diesen Kriterien kommt es zu den Ladezeiten.
                wie auch schon ·@tk1234 erwähnt hat, es macht wenig sinn die kriterien durch kategorie/album/subalbum einzuschränken, auf dauer macht der das keine freude.

                ich hab noch was schönes mit katzenbilderbn gefunden:
                https://web.dev/browser-level-image-lazy-loading/

                Ich kann leider auch nicht mit hochauflösenden Displays Dienen. es soll halt auf meinem smartphone und dem Rechner sowie TV angezeigt werden. Ich versuche damit im Grunde auch die Dateigrößen zu reduzieren, da mir 5 MB bei vielen Bildern zu viel sind. ich habe ca 4500 Bilder angesammelt das wäre fatal.
                responsive image loading:
                https://developer.mozilla.org/en-US/...ponsive_images
                https://imagekit.io/responsive-images/

                du kannst deien zig terra images über google photo ausliefern glaube ich.
                Mittlerweile habe ich ein wirklich schlechtes Gewissen überhaupt irgendwann mal nachgefragt zu haben.
                wieso ?
                meiner meinung machst du dir halt probleme wo keine sind.

                Kommentar


                • #9
                  Freunde, hier ist so ein krasses Sicherheitsleck im Forum... Das Escaping / Sanitizing der Inhalte hat ne Macke... will da mal jemand nach schauen, bevor es ausgenutzt wird?
                  Tutorials zum Thema Technik:
                  https://pilabor.com
                  https://www.fynder.de

                  Kommentar


                  • #10
                    also ich will da noch mal meine Ausgangssituation nachpflegen.

                    Was mein eigentliches Problem ist, ich nutze zur Darstellung also anzeige der Bilder, HighslideJS,
                    Das funktioniert so dass ich die Bilder per a href anzeigen und das HighslideJS damit arbeitet, auch die caption des jeweiligen Bildes wird somit generiert.

                    Die pagination kann ich mangels Erfahrung mit Javascript nicht einbinden.

                    Darum suche ich ja die Möglichkeit es schon beim Upload zu definieren.

                    Aber ok ich denke mal es wird da wohl keine Möglichkeit geben, somit beende ich das hier nun, ich will hier nicht weiter eure/deine Zeit verschwenden, Es war eine Idee.
                    Danke jedoch für eure/deine Hilfe.

                    Kommentar


                    • #11
                      Hallo, einige Beiträge sind wegen der falschen Darstellung raus genommen worden.

                      Gruß Mike

                      Kommentar


                      • #12
                        Zitat von hoefti Beitrag anzeigen
                        Hallo, einige Beiträge sind wegen der falschen Darstellung raus genommen worden.
                        Und damit ist das Problem "gelöst" oder wie? Ich wollte auf das gelöschte Posting eigentlich noch antworten wenn die Darstellung repariert ist - da das Posting jetzt weg ist, geht das aber natürlich nicht mehr …

                        Zitat von Satansmagic Beitrag anzeigen
                        Darum suche ich ja die Möglichkeit es schon beim Upload zu definieren.

                        Aber ok ich denke mal es wird da wohl keine Möglichkeit geben, somit beende ich das hier nun, ich will hier nicht weiter eure/deine Zeit verschwenden, Es war eine Idee.
                        Natürlich gibt es da eine Möglichkeit:
                        • vor dem Verarbeiten der hochgeladenen Bilder (also vor der while-Schleife) aus der Datenbank holen wieviel Bilder es in dem Subalbum schon gibt, Zähler auf diese Zahl setzen und Bezeichnung des Subalbums in einer Variable speichern
                        • in der Schleife wird dann geprüft wieviel Bilder es in dem Subalbum schon gibt (mit Hilfe des vorher definierten Zählers) und wenn die Maximalzahl überschritten ist, wird die Bezeichnung in der Variablen hochgesetzt und der Zähler wieder auf 0 gesetzt
                        • beim Speichern jeden Bildes wird die Bezeichnung in der Variablen als Subalbum verwendet
                        Ich erachte das Vorgehen trotzdem für wenig sinnvoll …


                        Was ich in #5 noch vergessen hatte:
                        • $_FILES enthält beim Hochladen von Dateien die Informationen zu den Dateien, davon, diese Variable für andere Zwecke selbst zu befüllen, würde ich abraten
                        • wenn du utf8_decode brauchst stimmt irgendwo was nicht, wenn du immer und überall UTF-8 verwendest ist das nicht notwendig
                        Auf das jetzt gelöschte Posting wollte ich noch antworten, zwei Sachen was ich noch in Erinnerung habe:
                        • der DSN (bzw. Data Source Name) ist der erste Parameter beim Aufbau einer Datenbankverbindung per PDO und enthält Informationen zum verwendeten Treiber (hier: mysql) sowie Host- und Datenbankname (und eben dem Charset, siehe nächster Punkt)
                        • im DSN muss der erwartete Charset mit »;charset=utf8mb4« angegeben werden damit die Datenbank weiß wie du deine Daten gerne hättest - wenn du das nicht angibst bist du von Standardwerten abhängig die zwar passen können aber eben auch falsch sein können. Mit dem was im CREATE-TABLE-Statement als Charset angegeben ist, hat das auch nichts zu tun: dort wird angegeben wie die Daten gespeichert werden, das muss aber nicht zwangsläufig mit dem Charset der Ausgabe identisch sein.

                        Kommentar


                        • #13
                          Nachtrag
                          Ich habe es nun hinbekommen mit der pagination in der Ausgabeseite
                          ABER

                          es klappt bezüglich des Highslide JS nicht

                          wenn ich auf die nächste Seite möchte werde ich wieder zurück zur Auswahlseite geschickt.
                          das war ja auch meine Vermutung weshalb ich ja den Subalbumname mit einer laufenden Nummer ergänzen wollte beim Upload. Aber gut so funzt das alles nicht,

                          tk1234, auch wenn du jetzt wohl anderer Meinung bist, ja ich hab mittlerweile schon mal bezüglich der Datenbankstruktur sowie 1:n bzw n:1 Verknüpfungen und pdo umsetzung angesehen.
                          Jedoch ist dieses erst mal nach längerem Bedenken meinerseits nicht das Problem.
                          ich nutze ja schlicht und einfach die 1.Normalform.
                          Ich schliesse so doppelte Bilder aus die werden weder auf dem Server gespeichert noch werden die in der Datenbank aufgenommen.
                          Bezieht sich jedoch nur nach dem Dateinamen in der DB.
                          Ich habe eine für mich überschaubare Struktur. Und komme damit klar. Natürlich ist die erst mal Augenkrebserzeugend und Magenumdrehend ür jeden der sich das Wissen zu den Themen schwer erarbeitet hat.
                          Ich muss halt meinen Weg gehen.

                          Leider komme ich in der Sache hier so mal nicht weiter, also werde ich schmerzlich versuchen auch noch ein Highslide JS nachzuempfinden um irgendwann mal auf den Nenner zu kommen.

                          Danke jedoch mal allen die hier versucht haben mir zu helfen.

                          ​​​​​​​Grüße Alex



                          .
                          Zitat von hoefti Beitrag anzeigen
                          Hallo, einige Beiträge sind wegen der falschen Darstellung raus genommen worden.

                          Gruß Mike
                          Hi Mike verstehe ich, leider konnte ich es nicht mehr nachträglich ändern.
                          es wurden ich glaude 2 Quoteschließtags von mir vergessen. leider kann ich mich nicht mehr genau daran erinnern, was ich alles angab. Jedoch alles ok bin nicht sauer weil hat mich ja auch generft.
                          Und hallo tk1234 bitte,, natürlich will ich nicht dass du meine Arbeit übernimmst bzw ausführst. Auf deine Antwort gehe ich später ein.

                          Wie geschrieben ich will nicht dass du mir die Arbeit abnimmst, und ich bin auch deiner Meinung, wenn du was lernen willst dann lerne und schreibe nicht ab.

                          Jedoch habe ich ja auch geschrieben wo meine Probleme bezüglich dem Lernen bestehen. Du hast mir sowas von einen Floh ims Ohr gesetzt.

                          Es war ca im Jahr 2000 als ich mit MS ACCESS DB erstellt habe in meiner damaligen Umschulung. Und da verstand ich noch die Umsetzung deines Ansatzes bezüglich der getrennten Tabellen und deren Verknüpfungen.

                          da wäre es mir kein Problem gewesen. Jedoch war es da so dass die Zusammenhänge eher anders geartet waren. Ging steno um Hersteller Artikel Kunde usw.

                          In meinem Projekt sehe ich es doch eher umständlich, zumal ich da ja wenn Ich ein Bild von vielen in der Reihe die Infos in verschiedene Tabellen unterbringen muss. Die relevanteste Angabe jedoch ist der Pfad zur Bilddatei, und zur Kriterienauswahl für fie Suche die Kategorie, das Album und das Subalbum. Mein Plan war es halt nur mit den 3 Kriterien zu machen um die Suchvarianten geringer und einfacher zu halten. natürlich habe ich auch tag monat jahr als optoion Offen gelassen.



                          Ich speichere ja die Bilder in einen (einzigen) Ordner und die Thumbnails in einen anderen Ordner.
                          zum Wählen der anzuzeigenden Bilder Wählte ich halt die Kategorie, das Album und das Subalbum. was ich nebst dem Pfad zur Bilddatei und der Thumbdatei in einer Tabelle speichere.

                          Dies soll halt einfach so bleiben
                          Weil ich halt folgender Kriteriumgebung als meine Lösung gewählt habe:

                          Kategorie > Urlaub
                          Album Tunesien
                          Subalbum Tag 1

                          Da ich ja von meiner Situation ausgehe dass ich die Urlaube in diesem all ja hatte und somit weis ob ich diese weiter zu definieren habe funktioniert dieses ja auch


                          Kategorie > Urlaub
                          Album > Tunesien 2018
                          Subalbum >Tag 1 ... Tag xyz

                          Kategorie > Urlaub
                          Album > Tunesien 2019
                          Subalbum > Tag 1 ... Tag xyz

                          Soweit alles OK.

                          Deine Hinweise sind ja z.Bsp. bezüglich dem, was passiert wenn ich folgendes eintragen will sofern ich, was ja nicht vorhersehbar ist, noch mal zu solchen Einträgen komme.
                          Wie zum Beispiel

                          Kategorie > Urlaub
                          Album > Tunesien 2024
                          Subalbum > Tag 1 ... Tag xyz-

                          Klar ist dass so wie ich es grade habe völlig unkonfortabel.
                          dafür war meine Idee eher vollkommen primitiv, und zwar würde ich in der db direkt die Einträge ändern.

                          Eben auf fehlender Erkeinntnis wie sich die Tabellen trenne.
                          und die verweise erstelle.

                          Ich begreife z. B. nicht wie ich die Verbindungen zuweise

                          Beispiel:

                          Kategorie:

                          ID | Kategorie


                          Album:

                          ID | Album | Kategorie ID



                          Subalbum:

                          ID | Subalbum | Album ID | Kategorie ID



                          Wie weis da die Datenbank was hinter der Album ID steht.

                          Ich komme nicht mir der Beziehungsfunktion klar. Nenn mich dumm, aber ich bekomm das nicht gebacken.

                          Alleine schon wie mach ich die Einträge im PHP muss ich die einzeln schreiben ala ok schreib die Kategorie in die Tabelle Kategorie und dann lese die ID der Kategorie und schreibe das Album und die Kategorie ID in die Album Tabelle un dann in die Tabelle Subalbum das Subalbum die Album ID und die Kategorie ID.
                          Ist doch mega umständlich oder irre ich mich.


                          Kommentar


                          • #14
                            Hi tk1234,
                            nun bin ich endlich da angekommen, wo mich dein vorhergesehens Problem mit meiner DB Struktur, betrifft.

                            Ich muss nämlich über eine überflüssige weitere Abfrage die kleinste id eines Eintrages abfragen. hab ich soweit schon hinbekommen. Jdenfalls die Abfrage in php und auch Ausgabe.

                            Aber auch beim Lesen diverser MYSQL Tutorials komm ich nicht dahinter wie ich es richtig umsetzen kann.

                            Ich habe mich ja für folgende Variante entschieden bei der Auswahl:
                            Kategorie (z.B. Urlaub)
                            Album (z.B. Urlaub Tunesien)
                            Subalbum (z.B. Tag 1)

                            wiebekomme ich es jedoch hin dass ich wenn ich zb die bilddaten in die Subalbumtabelle schreibe und die kategorie id und album id verknüpfe dassdie bilder id je Subalbum wieder von 1 anfängt

                            Kommentar


                            • #15
                              Zitat von Satansmagic Beitrag anzeigen
                              wiebekomme ich es jedoch hin dass ich wenn ich zb die bilddaten in die Subalbumtabelle schreibe und die kategorie id und album id verknüpfe dassdie bilder id je Subalbum wieder von 1 anfängt
                              Dir ist schon klar dass niemand außer dir weiß wie deine Datenbankstruktur aktuell aussieht, oder? Wobei mir die Struktur immer noch falsch zu sein scheint …
                              Aber die Antwort lautet: garnicht. Eine ID ist eine ID und hat sonst keinerlei weitere Bedeutung - nummeriert werden die Bilder unabhängig von ihrer ID, entweder im PHP-Code oder direkt beim Abfragen aus der Datenbank (Window-Funktionen existieren).

                              PS: lass bitte das mit der Fett-Formatierung

                              Kommentar

                              Lädt...
                              X