2013-04-07 6 views
0

Итак, я пытаюсь настроить свой загрузчик изображений, чтобы, если изображение превышает 35kb, сжимайте его, но оно не работает, не думайте, что я делаю это правильно, поскольку это всегда дает мне ошибку «Размер файла слишком большой! Максимальное значение составляет 35 кбайт, попробуйте использовать на нем еще некоторое сжатие или найти другое изображение».сжать загруженное изображение, если оно слишком большое

Вот мой код:

function article_top_image($article_id) 
{ 
    global $db, $config; 

    if (isset($_FILES['new_image']) && $_FILES['new_image']['error'] == 0) 
    { 
     if ([email protected]($_FILES['new_image']['tmp_name'], 'r')) 
     { 
      $this->error_message = "Could not find image, did you select one to upload?"; 
      return false; 
     } 

     else 
     { 
      // check the dimensions 
      list($width, $height, $type, $attr) = getimagesize($_FILES['new_image']['tmp_name']); 

      // check if its too big 
      if ($_FILES['new_image']['size'] > 35900) 
      { 
       // compress it to see if we can make it smaller 
       imagejpeg($_FILES['new_image']['tmp_name'], $_FILES['new_image']['tmp_name'], 50); 

       // check again 
       if ($_FILES['new_image']['size'] > 35900) 
       { 
        $this->error_message = 'File size too big! The max is 35kb, try to use some more compression on it, or find another image.'; 
        return false; 
       } 
      } 

      else if ($width > $config['article_image_max_width'] || $height > $config['article_image_max_height']) 
      { 
       $this->error_message = 'Too big!'; 
       return false; 
      } 

      // this will make sure it is an image file, if it cant get an image size then its not an image 
      else if (!getimagesize($_FILES['new_image']['tmp_name'])) 
      { 
       $this->error_message = 'Not an image!'; 
       return false; 
      } 
     } 

     // see if they currently have an avatar set 
     $db->sqlquery("SELECT `article_top_image` FROM `articles` WHERE `article_id` = ?", array($article_id)); 
     $image = $db->fetch(); 

     // give the image a random file name 
     $imagename = rand() . 'id' . $article_id . '.jpg'; 

     // the actual image 
     $source = $_FILES['new_image']['tmp_name']; 

     // where to upload to 
     $target = $_SERVER['DOCUMENT_ROOT'] . "/uploads/articles/topimages/" . $imagename; 

     if (move_uploaded_file($source, $target)) 
     {   
      // remove old avatar 
      if ($image['article_top_image'] == 1) 
      { 
       unlink($_SERVER['DOCUMENT_ROOT'] . '/uploads/articles/topimages/' . $image['article_top_image_filename']); 
      } 

      $db->sqlquery("UPDATE `articles` SET `article_top_image` = 1, `article_top_image_filename` = ? WHERE `article_id` = ?", array($imagename, $article_id)); 
      return true; 
     } 

     else 
     { 
      $this->error_message = 'Could not upload file!'; 
      return false; 
     } 

     return true; 
    } 

} 
+0

Как-то я не думаю, что '$ _FILES ['new_image'] ['size']' будет изменен с новым размером изображения после того, как вы сохраните это изображение. Кроме того, не обязательно гарантировать, что изображение может быть сжато до 35 КБ за один проход без потери слишком высокого качества. – DCoder

+0

Качество - это не проблема, так как это будет очень маленькое изображение. – NaughtySquid

ответ

1

вы должны повторно filesize. Может потребоваться сначала позвонить clearstatcache.

filesize($_FILES['new_image']['tmp_name']) 
+0

Выполнение clearstatcache, а затем выполнение if (filesize ($ _ FILES ['new_image'] ['tmp_name'])> 35900) все равно приводит к той же ошибке каждый раз – NaughtySquid

0

Я также работаю над сжатием изображений, которые являются большими. Я использую следующий код.

function image_quality() 
{ 
    $name = ''; $type = ''; $size = ''; $error = ''; 
    function compress_image($source_url, $destination_url, $quality) 
    { 
     $info = getimagesize($source_url); 

      if ($info['mime'] == 'image/jpeg') 
        $image = imagecreatefromjpeg($source_url); 

      elseif ($info['mime'] == 'image/gif') 
        $image = imagecreatefromgif($source_url); 

      elseif ($info['mime'] == 'image/png') 
        $image = imagecreatefrompng($source_url); 

      imagejpeg($image, $destination_url, $quality); 
     return $destination_url; 
    } 

    $dir = 'images_high'; 
    $files = scandir($dir); 
    foreach($files as $image) 
    { 
     $size=filesize("images_high/$image"); 
     if ($size <=50000) 
       rename("images_high/$image","user_images/$image"); 

     $url = "user_images/$image"; 
     $filename = compress_image("images_high/$image", $url, 20); 
     $buffer = file_get_contents($url); 

     unlink("images_high/$image"); 
    } 
} 

Надеюсь, это поможет вам.

Смежные вопросы