Я установлю эскиз в базе данных
У меня есть 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
Тем не менее, было бы целесообразно записать образ в файловую систему и сохранить путь к нему в базе данных. Таким образом, изображение может быть представлено в виде статического файла, что повысит производительность во всех отношениях.