1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen

Tabelle Auslesen fehlende Images downloaden

Dieses Thema im Forum "PHP" wurde erstellt von leo_nie, 21. Dezember 2016.

  1. leo_nie

    leo_nie Grünschnabel

    Ich bräuchte ein wenig Hilfe.
    Ich habe eine MySQL DB mit einer Tabelle 'images'. Hier sind im Feld 'image' die Bildurl gespeichert.
    Die Bilder werden gedownload und in ein Verzeichnis gespeichert. Im DB-Feld 'image_server' wird der Pfad zum Server gespeichert.

    Jetzt möchte ich folgendes:
    1. Zuerst soll überprüft werden welche Bilder noch im Verzeichnis fehlen
    2. die fehlenden Bilder sollten automatisch gedownloaded werden und im Verzeichnis gespeichert werden
    3. Im DB-Feld 'image_server' sollte automatisch die entsprechende Dateiname gespeichert werden

    Wie kann ich hier am besten vorgehen? Welcher ist am schnellsten?
     
  2. sheel

    sheel I love Asm Administrator

    Hi

    was steht denn in den Pfaden der noch nicht geladenen Bilder? Leer oder falscher Pfad oder...?
    Ist das ganze eine einmalige Aktion, oder soll das regelmäßig passieren, oder durch Benutzer ausgelöst (alle oder pro Benutzer nur bestimmte oder)...?

    Hast du schon einen Codeversuch für einen Teil?
     
  3. leo_nie

    leo_nie Grünschnabel

    Das sollte regelmäßig passieren vom Benutzer angestoßen werden oder noch besser als cronjob übernacht laufen. Die URL-Pfaden stehen alle in der Datenbank im Feld image, die Felder mit 'image_server is null' sollten selektiert werden.
    z.B. Tabelle artikelbilder
    Datensatz 1
    Feld Artikelnr: Artikel100
    Feld Image: www.artikelbilderzeigen.de/image100.jpg
    Feld Image_server: /html/artikelbilderzeigen/bilder/image100.jpg
    Datensatz 2
    Feld Artikelnr: Artikel200
    Feld Image: www.artikelbilderzeigen.de/image200.jpg
    Feld Image_server: <null>

    Selektieren alle Datensätze die noch nicht runter geladen sind
    Select artikelnr, image, from artikelbilder where image_server is null

    Für jeden Datensatz muss jetzt folgendes passieren:
    - runterladen www.artikelbilderzeigen.de/image200.jpg in das Server-Verzeichnis /html/artikelbilderzeigen/bilder/
    - Update artikelbilder set Image_server = '/html/artikelbilderzeigen/bilder/image200.jpg' where artikelnr = artikelnr_variable

    Code versuch
    <?php
    $servername = "localhost";
    $username = "username";
    $password = "password";
    $dbname = "myDB";

    // Create connection
    $conn = new mysqli($servername, $username, $password, $dbname);
    // Check connection
    if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
    }

    $sql = "SELECT produktnr,image FROM artikelbilder where image_server ist null";
    $result = $conn->query($sql);

    if ($result->num_rows > 0) {
    // output data of each row
    while($row = $result->fetch_assoc()) {
    $image = $row["image"];
    $produktnr= $row["produktnr"]

    //Hier wird die Datei runtergeladen und gespeichert
    $contents= file_get_contents($image);
    $savename = $image;

    $savefile = fopen("$savename.jpg", "w");
    fwrite($savefile, $contents);
    fclose($savefile);

    //Hier wird die Dateiname in der Tabelle gespeichert
    $neue_image_server['image_server'] = $savefile;

    $sth = $dbh->prepare('UPDATE artikelbilder SET imageserver = :image_server where produktnr= :produktnr');
    $sth->execute(array(':image_server' => $image_server, ':produktnr' => $produktnr));

    }
    } else {
    echo "0 results";
    }
    $conn->close();
    ?>
     
  4. leo_nie

    leo_nie Grünschnabel

    Okay jetzt habe ich es raus gefunden

    so funktiontiert es:
    <?php

    $pdo = new PDO('mysql:host=localhost;dbname=??', '??', '??');

    $sql = "SELECT * FROM artikelbilder where ximage_server ='' ";
    foreach ($pdo->query($sql) as $row) {

    $produktnr = $row['Xproduktid'];
    $imageURL = $row['Ximage'];

    //get extension of image
    $ext = pathinfo($imageURL, PATHINFO_EXTENSION);
    $file = basename($imageURL,".".$ext);

    $newfile = $produktnr."-".$file.".".$ext;
    echo $newfile."<br />";

    //Local path of image - where will we save the image
    $downloadTo = fopen($newfile, 'wb');

    //Download and save image
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $imageURL);
    curl_setopt($ch, CURLOPT_FILE, $downloadTo);
    curl_setopt($ch, CURLOPT_HEADER, 0);
    $output = curl_exec($ch);
    curl_close($ch);

    //Update image_server Filename
    $statement = $pdo->prepare("UPDATE artikelbilder SET ximage_server= :image_server where xproduktid = :xproduktid and ximage = :imageURL");
    $statement->execute(array('image_server'=> $newfile, 'imageURL' => $imageURL, 'xproduktid' =>$produktnr ));

    echo "Gespeichert"."<br />";
    }



    Jetzt möchte ich aber noch gerne die Bilder um 40% verkleinern. Kann jemand hier behilflich sein?
     
  5. Bratkartoffel

    Bratkartoffel gebratene Kartoffel Premium-User

  6. leo_nie

    leo_nie Grünschnabel

    Okay, alles klar. Auch funktioniert jetzt wunderbar, aber leider bricht das script ab: Maximum execution time exceeded.
    Kann ich dies irgendwie umgehen oder was kann man da am besten machen?



    Code (Text):
    1. <?php
    2.  
    3. const IMAGE_HANDLERS = [
    4.     IMAGETYPE_JPEG => [
    5.         'load' => 'imagecreatefromjpeg',
    6.         'save' => 'imagejpeg',
    7.         'quality' => 100
    8.     ],
    9.     IMAGETYPE_PNG => [
    10.         'load' => 'imagecreatefrompng',
    11.         'save' => 'imagepng',
    12.         'quality' => 0
    13.     ],
    14.     IMAGETYPE_GIF => [
    15.         'load' => 'imagecreatefromgif',
    16.         'save' => 'imagegif'
    17.     ]
    18. ];
    19.  
    20. /**
    21.  * @param $src - a valid file location
    22.  * @param $dest - a valid file target
    23.  * @param $targetWidth - desired output width
    24.  * @param $targetHeight - desired output height or null
    25.  */
    26. function createThumbnail($src, $dest, $targetWidth, $targetHeight = null) {
    27.  
    28.     // 1. Load the image from the given $src
    29.     // - see if the file actually exists
    30.     // - check if it's of a valid image type
    31.     // - load the image resource
    32.  
    33.     // get the type of the image
    34.     // we need the type to determine the correct loader
    35.     $type = exif_imagetype($src);
    36.  
    37.     // if no valid type or no handler found -> exit
    38.     if (!$type || !IMAGE_HANDLERS[$type]) {
    39.         return null;
    40.     }
    41.  
    42.     // load the image with the correct loader
    43.     $image = call_user_func(IMAGE_HANDLERS[$type]['load'], $src);
    44.  
    45.     // no image found at supplied location -> exit
    46.     if (!$image) {
    47.         return null;
    48.     }
    49.  
    50.  
    51.     // 2. Create a thumbnail and resize the loaded $image
    52.     // - get the image dimensions
    53.     // - define the output size appropriately
    54.     // - create a thumbnail based on that size
    55.     // - set alpha transparency for GIFs and PNGs
    56.     // - draw the final thumbnail
    57.  
    58.     // get original image width and height
    59.     $width = imagesx($image);
    60.     $height = imagesy($image);
    61.  
    62.     // maintain aspect ratio when no height set
    63.     if ($targetHeight == null) {
    64.  
    65.         // get width to height ratio
    66.         $ratio = $width / $height;
    67.  
    68.         // if is portrait
    69.         // use ratio to scale height to fit in square
    70.         if ($width > $height) {
    71.             $targetHeight = floor($targetWidth / $ratio);
    72.         }
    73.         // if is landscape
    74.         // use ratio to scale width to fit in square
    75.         else {
    76.             $targetHeight = $targetWidth;
    77.             $targetWidth = floor($targetWidth * $ratio);
    78.         }
    79.     }
    80.  
    81.     // create duplicate image based on calculated target size
    82.     $thumbnail = imagecreatetruecolor($targetWidth, $targetHeight);
    83.  
    84.     // set transparency options for GIFs and PNGs
    85.     if ($type == IMAGETYPE_GIF || $type == IMAGETYPE_PNG) {
    86.  
    87.         // make image transparent
    88.         imagecolortransparent(
    89.             $thumbnail,
    90.             imagecolorallocate($thumbnail, 0, 0, 0)
    91.         );
    92.  
    93.         // additional settings for PNGs
    94.         if ($type == IMAGETYPE_PNG) {
    95.             imagealphablending($thumbnail, false);
    96.             imagesavealpha($thumbnail, true);
    97.         }
    98.     }
    99.  
    100.     // copy entire source image to duplicate image and resize
    101.     imagecopyresampled(
    102.         $thumbnail,
    103.         $image,
    104.         0, 0, 0, 0,
    105.         $targetWidth, $targetHeight,
    106.         $width, $height
    107.     );
    108.  
    109.  
    110.     // 3. Save the $thumbnail to disk
    111.     // - call the correct save method
    112.     // - set the correct quality level
    113.  
    114.     // save the duplicate version of the image to disk
    115.     return call_user_func(
    116.         IMAGE_HANDLERS[$type]['save'],
    117.         $thumbnail,
    118.         $dest,
    119.         IMAGE_HANDLERS[$type]['quality']
    120.     );
    121.  
    122.  
    123.  
    124. }
    125.  
    126.  
    127. $file = 'image_protokoll.txt';
    128. $current = file_get_contents($file);
    129. $current ="Images die nicht geladen werden konnten:\n";
    130. // Schreibt den Inhalt in die Datei zurück
    131. file_put_contents($file, $current);
    132.  
    133. $pdo = new PDO('mysql:host=localhost;dbname=??', '??', '??');
    134.  
    135. $sql = "SELECT * FROM artikelbilder where ximage_server IS NULL or ximage_server = '' ";
    136.  
    137. foreach ($pdo->query($sql) as $row) {
    138.    $produktnr = $row['xproduktid'];
    139.    $imageURL = $row['ximage'];
    140.    //Manchmal ist in der url ein leerzeichen bei der Marke,dies muss abgefangen werden
    141.    $imageURL = str_replace(' ', '%20', $imageURL);
    142.  
    143.     //get extension of image
    144.     $ext = pathinfo($imageURL, PATHINFO_EXTENSION);
    145.     $file = basename($imageURL,".".$ext);
    146.  
    147.     $newfile = $produktnr."-".$file.".".$ext;
    148.     $newfilethum = $produktnr."-".$file."-thumb".".".$ext;
    149.  
    150.  
    151.     //Local path of image - where will we save the image
    152.     $downloadTo = fopen($newfile, 'wb');
    153.  
    154.     //Download and save image
    155.     $ch = curl_init();
    156.     curl_setopt($ch, CURLOPT_URL, $imageURL);
    157.     curl_setopt($ch, CURLOPT_FILE, $downloadTo);
    158.     curl_setopt($ch, CURLOPT_HEADER, 0);
    159.     $output = curl_exec($ch);
    160.     curl_close($ch);
    161.  
    162.     //Verkleinern
    163.     createThumbnail($newfile, $newfilethum, 200);
    164.  
    165.       //Update image_server Filename nur update wenn Datei auch tatsächlich besteht
    166.     if(!file_exists($newfilethum))
    167.     {
    168.         $file = 'image_protokoll.txt';
    169.         // Öffnet die Datei, um den vorhandenen Inhalt zu laden
    170.         $current = file_get_contents($file);
    171.         // Fügt eine neue Person zur Datei hinzu
    172.         $current .= $produktnr." - ".$imageURL."\n";
    173.         // Schreibt den Inhalt in die Datei zurück
    174.         file_put_contents($file, $current);
    175.      
    176.        
    177.     } else {
    178.  
    179.         $statement = $pdo->prepare("UPDATE artikelbilder SET ximage_server= :image_server where xproduktid = :xproduktid and ximage = :imageURL");
    180.         $statement->execute(array('image_server'=> $newfilethum, 'imageURL' => $imageURL, 'xproduktid' =>$produktnr ));
    181.  
    182.     }
    183.  
    184.  
    185.  
    186. }
    187.  
    188.  
    189. ?>
     
  7. sheel

    sheel I love Asm Administrator

    Idealerweise nicht vom Browser heraus aufrufen, sondern wie oben schon geplant als Cronjob laufen lassen (CLI-Version von PHP).
     
Die Seite wird geladen...