Я установлю эскиз в базе данных

У меня есть PHP-скрипт, который добавляет фотографию в базу данных с некоторыми полями, это прекрасно работает. Изображение в моей базе данных является BLOB. Теперь я добавлю миниатюру этого изображения прямо в базу данных тоже. Я делаю это с библиотекой GD, но она не работает.

BLOB с миниатюры 0b, кто-нибудь может мне помочь с этой проблемой? Соединение с базой данных осуществляется в top_bar и работает. Все установлено в базе данных, только миниатюра нет.

  <?php
        include 'top_bar.php';
    ?>

    <div id="content">
      <?php
    if (isset($_FILES['image']) && $_FILES['image']['size'] < 60000000) { //kijken of de image is verstuurd

    // Temporary file name stored on the server

    $titel = $_POST["titel"];
    $beschrijving = $_POST["beschrijving"];
    $datum = date('Y/m/d', time());
    $categorie = $_POST["categorie"];
    $tmpName = $_FILES['image']['tmp_name'];

    // Read the file
    $fp = fopen($tmpName, 'r');
    $data = fread($fp, filesize($tmpName));
    $data = addslashes($data);
    fclose($fp);

  $thumb = base64_decode($data);
  $oSourceImage = imagecreatefromstring($thumb);

  $nWidth = imagesx($oSourceImage); // get original source image width
  $nHeight = imagesy($oSourceImage); // and height

  // create small thumbnail
  $nDestinationWidth = 200;
  $nDestinationHeight = 200;
  //$oDestinationImage = imagecreatetruecolor($nDestinationWidth, $nDestinationHeight);
  $oDestinationImage = imagecreate($nDestinationWidth, $nDestinationHeight);

  imagecopyresized($oDestinationImage, $oSourceImage, 0, 0, 0, 0, $nDestinationWidth, $nDestinationHeight, $nWidth, $nHeight); // resize the image

  ob_start(); // Start capturing stdout.
  imageJPEG($oDestinationImage); // As though output to browser.
  $sBinaryThumbnail = ob_get_contents(); // the raw jpeg image data.
  ob_end_clean(); // Dump the result so it does not screw other output.
  $sBinaryThumbnail = addslashes($sBinaryThumbnail);


    // Create the query and insert
    // into our database.
    mysqli_query($db,"INSERT INTO images (id, titel, beschrijving, datum, categorie, image, thumb)
                VALUES ('','$titel','$beschrijving','$datum','$categorie','$data', '$sBinaryThumbnail')");

    // Print results
    echo "<p>De image is opgeslagen in de database.</p>";

    }
    else {
    echo "<p>Je hebt nog geen image gekozen, of het bestand is te groot</p>";
    }
    ?>

    <?php
    if(isset($_POST['verstuur']) && ($_FILES["bestand"]["size"] > 60000000)) {// Bericht voor als het is verstuurd maar groter is dan 60kb
      echo "het bestand is te groot, probeer het nogmaals";
      }
    ?>
    <div id="upload_form">
    <form enctype="multipart/form-data"  method="post" >
    <p>Titel:</p>          <input type="text" name="titel"><br />
    <p>Beschrijving:</p>   <textarea rows="4" cols="50" name="beschrijving" placeholder="Typ hier een beschrijving"></textarea><br />
    <p class="info">De volgende categorieën bestaan op deze website:
    <?php
    $query = mysqli_query($db, "SELECT DISTINCT(categorie) FROM images");//DISTINCT laat alleen unieke waardes zien
                    while($rij = mysqli_fetch_array($query)){
                         echo $rij['categorie']. ", ";
                     }
    ?> <br/>U kunt deze overnemen, of een nieuwe categorie toevoegen. Dit doet u door gewoon een nieuwe categorie te typen.</p>
    <p>Categorie:</p>      <input type="text" name="categorie"><br/>
    <p>Image:</p> <input name="image" accept="image/jpeg, image/png, image/gif" type="file"><br/>
    <input value="Verzenden" type="submit" id="button">
    </form>
    </div>

    <?php
        include 'left_menu.php';
    ?>

У меня есть четыре предупреждения с этим сценарием, кто-нибудь может объяснить, почему я получаю эти предупреждения? Предупреждения:

Warning: imagecreatefromstring(): Empty string or invalid image in *MY URL* on line 24 Warning: imagesx() expects parameter 1 to be resource, boolean given in *MY URL* on line 25  Warning: imagesy() expects parameter 1 to be resource, boolean given in *MY URL* on line 26  Warning: imagecopyresized() expects parameter 2 to be resource, boolean given in *MY URL* on line 36

1 ответ

Прочитайте документацию imagejpeg() функция. То, как вы его называете, напрямую выводит изображение в выходной буфер. Переменная $tn содержит только идентификатор ресурса. Вы могли бы использовать ob_start() а также ob_get_flush() ( документация) по всему imagejpg() вызовите, чтобы получить фактическое изображение, не записывая его в файл:

ob_start();
imagejpeg($tn);
$image_contents = ob_get_flush();
// Now write $image_contents to the database, instead of $tn

Тем не менее, было бы целесообразно записать образ в файловую систему и сохранить путь к нему в базе данных. Таким образом, изображение может быть представлено в виде статического файла, что повысит производительность во всех отношениях.

Другие вопросы по тегам