#php #image #memory #upload #resize
#php #изображение #память #загрузка #изменить размер
Вопрос:
Здравствуйте, ребята и дамы,
Я пытаюсь загружать и сохранять изображения в базе данных. Мой код работает, но когда я его протестирую, то через три или четыре раза изображение частично сохранится вот так:
В моем коде я могу сохранить до 12 изображений (если они загружены). И я тестирую с 4 изображениями. Что я делаю не так? Это проблема с памятью? И если это так..что является причиной этого? спасибо вам за помощь.
Мой код таков:
//save up to 12 images in database for($i=1;$ilt;=12;$i ){ $fileName = $_FILES['image'.$i]['name']; if ($fileName){ try{ list($origWidth, $origHeight, $type) = getimagesize($_FILES['image'.$i]['tmp_name']); $temp_name = "tempupload/".$fileName; //make thumbnail to save in database //resize the image to 200px and save as/in $temp_name (see resizeImage function) resizeImage($_FILES['foto'.$i]['tmp_name'], $temp_name, 200, 200); //retrieve saved image to put a watermark on it switch(strtolower(image_type_to_mime_type($type))) { case 'image/jpeg': $im2 = @imagecreatefromjpeg($temp_name); break; case 'image/png': $im2 = @imagecreatefrompng($temp_name); break; } //put watermark $watermark = imagecreatefrompng('../assets/images/logo/watermark.png'); $marge_right = 10; $marge_bottom = 10; $sx = imagesx($watermark); $sy = imagesy($watermark); imagecopy($im2, $watermark, imagesx($im2) - $sx - $marge_right, imagesy($im2) - $sy - $marge_bottom, 0, 0, imagesx($watermark), imagesy($watermark)); //save image with watermark switch(strtolower(image_type_to_mime_type($type))) { case 'image/jpeg': imagejpeg($im2, $temp_name); break; case 'image/png': imagepng($im2, $temp_name); break; } //open saved temp image $saved_temp = fopen($temp_name,"rb"); //addslashes to image to save in database as BLOB $image = addslashes(fread($saved_temp ,filesize($temp_name))); fclose($saved_temp ); //End thumbnail //Next part is to save the image in database in 1200px if user want this. //this is used so that the user can download and use the image afterwards $downloadimage=""; if(($_POST['image'.$i.'_Save']!="no") amp;amp; ($_SESSION['package']!="A")){ //if width or height are smaller 700 us original width or height $w = ($origWidth gt; 1200)?1200:$origWidth; $h = ($origHeight gt; 1200)?1200:$origHeight; if(($origWidth gt; 1200) || ($origHeight gt; 1200)){ //use same $temp_name to save memory???? resizeImage($_FILES['image'.$i]['tmp_name'], $temp_name, $w, $h,100); }else{ //if image is to small, then move and save as $temp_name move_uploaded_file($_FILES['image'.$i]["tmp_name"],$temp_name); } //put watermark if(($_SESSION['package']=="B")){ // Get dimensions and type of $temp_name. list($origWidth, $origHeight, $type) = getimagesize($temp_name); switch(strtolower(image_type_to_mime_type($type))) { case 'image/jpeg': $im2 = @imagecreatefromjpeg($temp_name); break; case 'image/png': $im2 = @imagecreatefrompng($temp_name); break; } imagecopy($im2, $watermark, imagesx($im2) - $sx - $marge_right, imagesy($im2) - $sy - $marge_bottom, 0, 0, imagesx($watermark), imagesy($watermark)); switch(strtolower(image_type_to_mime_type($type))) { case 'image/jpeg': imagejpeg($im2, $temp_name); break; case 'image/png': imagepng($im2, $temp_name); break; } } $saved_temp = fopen($temp_name,"rb"); $downloadimage = addslashes(fread($saved_temp ,filesize($temp_name))); fclose($saved_temp ); } //End making downloadimage //SQL to save images in database if(empty($downloadimage)){ $sql = "INSERT INTO tb_images(image,strange_id) VALUES (:image,:strange_id)"; $st = $conn-gt;prepare($sql); }else{ $sql = "INSERT INTO tb_images(image,strange_id,downloadimage,type) VALUES (:image,:strange_id,:downloadimage,:type)"; $st = $conn-gt;prepare($sql); $st-gt;bindValue( ":downloadimage", $downloadimage, PDO::PARAM_LOB ); $st-gt;bindValue( ":type", strtolower(image_type_to_mime_type($type)), PDO::PARAM_STR ); } $st-gt;bindValue( ":image", $image, PDO::PARAM_LOB ); $st-gt;bindValue( ":strange_id", $strange_id, PDO::PARAM_INT ); $st-gt;execute(); imagedestroy($watermark); unlink($temp_name); imagedestroy($im2); } catch (Exception $e){ echo e; } } }
функция изменения размера
/** * Resize image - preserve ratio of width and height. * @param string $sourceImage path to source JPEG/PNG image * @param string $targetImage path to final JPEG/PNG image file * @param int $maxWidth maximum width of final image (value 0 - width is optional) * @param int $maxHeight maximum height of final image (value 0 - height is optional) * @param int $quality quality of final image (0-100) * @return bool */ function resizeImage($sourceImage, $targetImage, $maxWidth, $maxHeight, $quality = 80) { $isValid = @getimagesize($sourceImage); if (!$isValid) { return false; } // Get dimensions and type of source image. list($origWidth, $origHeight, $type) = getimagesize($sourceImage); if ($maxWidth == 0) { $maxWidth = $origWidth; } if ($maxHeight == 0) { $maxHeight = $origHeight; } // Calculate ratio of desired maximum sizes and original sizes. $widthRatio = $maxWidth / $origWidth; $heightRatio = $maxHeight / $origHeight; // Ratio used for calculating new image dimensions. $ratio = min($widthRatio, $heightRatio); // Calculate new image dimensions. $newWidth = (int)$origWidth * $ratio; $newHeight = (int)$origHeight * $ratio; // Create final image with new dimensions. $newImage = imagecreatetruecolor($newWidth, $newHeight); // Obtain image from given source file. switch(strtolower(image_type_to_mime_type($type))) { case 'image/jpeg': $image = @imagecreatefromjpeg($sourceImage); if (!$image) { return false; } imagecopyresampled($newImage, $image, 0, 0, 0, 0, $newWidth, $newHeight, $origWidth, $origHeight); if(imagejpeg($newImage,$targetImage,$quality)) { // Free up the memory. imagedestroy($image); imagedestroy($newImage); return true; } break; case 'image/png': $image = @imagecreatefrompng($sourceImage); if (!$image) { return false; } imagecopyresampled($newImage, $image, 0, 0, 0, 0, $newWidth, $newHeight, $origWidth, $origHeight); if(imagepng($newImage,$targetImage, floor($quality / 10))) { // Free up the memory. imagedestroy($image); imagedestroy($newImage); return true; } break; default: return false; } }
Комментарии:
1. Пропустите все изменения размера и водяные знаки и выполняйте только загрузку, базу данных и просмотр. Проверьте это кучу раз. Если это всегда работает, добавьте обратно размер и снова протестируйте кучу. Если это сработает, добавьте обратно водяные знаки и повторите. Кроме того, удалите
@
подавление ошибок
Ответ №1:
Оке… после долгих испытаний… это решение моей собственной проблемы 🙂
прежде всего, эта строка…
Изменение размера изображения($_FILES[‘изображение’.$i][‘tmp_name’], $temp_name, $w, $h,100);
Настройка качества 100% для PNG была проблемой. Я не знаю почему, но я просто заменил это: imagepng($newImage,$targetImage, этаж($качество / 10)) на: imagepng($newImage,$targetImage) И я сделал это также для JPEG.
Затем вторая проблема возникла в моей базе данных. КАПЛЯ должна была быть ДЛИННОЙ КАПЛЕЙ.
Но теперь я больше не храню изображения в базе данных. Я сохраняю их в папке. Не из-за проблемы с ДЛИННЫМИ большими двоичными объектами, а просто потому, что это быстрее и требует меньше работы.