Проблема при загрузке и сохранении изображения в базе данных

#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.

Затем вторая проблема возникла в моей базе данных. КАПЛЯ должна была быть ДЛИННОЙ КАПЛЕЙ.

Но теперь я больше не храню изображения в базе данных. Я сохраняю их в папке. Не из-за проблемы с ДЛИННЫМИ большими двоичными объектами, а просто потому, что это быстрее и требует меньше работы.