tô fora do circuito há algum tempo, e só agora tô pegando pesado no assunto POO.
Estive vendo diversas classes de resize (c/ métodos para thumb, resize da original, crop e afins...) e reparei que todas "pecam" em ter que introduzir uma boa porção de códigos para suportar múltiplos uploads. Decidi começar o desenvolvimento de uma classe mais eficaz neste ponto, visto quase sempre o upload ser múltiplo.
Não tenho nenhum super poder em POO, e já esbarrei em um complicador que é ter que fazer um laço em cada método, para que ele seja aplicado a cada item do vetor $_FILES.
Alguém já tentou fazer uma implementação neste sentido?
A idéia (para upload já está funcionando) é aplicar a classe de forma bem simples, assim:
if (isset($_POST['submited']))
{
  $file = new UploadPictures($_FILES['pictures']);
  $file->moveFiles();
  echo $file->getErrors();
  
}A idéia de pegar e transformar o vetor $_FILES em outro, foi do Paulo André (ou Paulo Ricardo, não lembro ao certo). Eu apenas adaptei o raciocínio um pouco pq tinha um pequeno bug (os arquivos tinham que ser enviados em ordem correta).
A classe é esta: (apenas o construtor e os métodos moveFile() e getErrors() que estão funcionando no momento)
<?php
/*
* @author Nicholas Pufal
*/
class UploadPictures 
{
  private $security = array('allowed_types' => array('jpg','gif','png'));
  private $files = array();
  private $errors = array(); 
  private $dest_upload_dir; 
  private $dest_path; 
  
  public function __construct($spfiles, $dest_upload_dir = 'uploads/', $dest_extension = 'jpg')
  {
	$total_files = count($spfiles['name']); 
	$counter = 0;
	
	for ($i=0;$i<$total_files;$i++)
	{
	  if (!empty($spfiles['name'][$i]))
	  {
		$this->files[$counter]['name'] = $spfiles['name'][$i];
		$this->files[$counter]['extension'] = strtolower(pathinfo($spfiles['name'][$i],PATHINFO_EXTENSION));
		$this->files[$counter]['tmp_name'] = $spfiles['tmp_name'][$i];
		$this->files[$counter]['new_name'] = $this->getNewName(). '.' . $dest_extension;
		list($this->files[$counter]['width'],$this->files[$counter]['height']) = getimagesize($spfiles['tmp_name'][$i]);
		$this->files[$counter]['size'] = $spfiles['size'][$i] / 1048576; //convert to megabytes
		
		//$this->files[$counter]['type'] = $spfiles['type'][$i];
		//$this->files[$counter]['error'] = $spfiles['error'][$i];
		
		$counter++;
	  } 
	}
	
	//$this->debugger($this->files);
	$this->dest_upload_dir = $dest_upload_dir;
  }
  
  private function getNewName()
  {
	return md5(time() * mt_rand(1,9));
  }
  /*
  * Salva a imagem enviada (sem alterações), caso ela esteja de acordo com as extensões suportadas.
  * @return bool
  */  
  public function moveFiles()
  {
	foreach($this->files as $k => $v)
	{
	  if ($this->securityCheck($v['extension'],$v['size'],$v['name'],$k))
	  {
		if (move_uploaded_file($v['tmp_name'],$this->dest_upload_dir.$v['new_name']))
		{
		  echo $v['name']. "-> o upload foi concluído com êxito!<br/>";
		}
	  }
	}
  }
  
  private function createResource($ext)
  {
	switch ($ext)
	{
	  case "jpg" :
		return imagecreatefromjpeg($this->dest_path);
		break;
	  case "jpeg" :
		return imagecreatefromjpeg($this->dest_path);
		break;
	  case "png" :
		return imagecreatefrompng($this->dest_path);
		break;
	  case "gif" :
		return imagecreatefromgif($this->dest_path);
		break;
	  default:
		$this->errors[] = "Não foi possível criar um resource para a imagem.";
		break;
	}	
  }
  
  public function createThumb($dest_width = 500, $dest_height = 350, $quality = 80)
  {
	if (file_exists($this->dest_path))
	{
	  $dst_image = imagecreatetruecolor($dest_width, $dest_height);
	  
	  $src_resource = $this->createResource($this->src_extension);
	  
	  imagecopyresampled ($dst_image , $src_resource, 0, 0, 0, 0, $dest_width, $dest_height, $this->src_width, $this->src_height);
	  
	  imagejpeg($dst_image,$this->dest_upload_dir.'thumb_'.$this->getNewName(). $this->dest_extension/*alterar*/, $quality);	  
	}
  }
  private function securityCheck($extension,$size,$name,$k)
  {
	$arr_keys = array_keys($this->security);
	
	//Supported extensions
	if (in_array('allowed_types',$arr_keys))
	{
	  if (!in_array($extension,$this->security['allowed_types']))
	  {
		$this->errors[$k][] = $name ." -> Extensão ".$extension." não é permitida.";
	  }
	}
	
	//Max size
	if (in_array('max_size',$arr_keys))
	{
	  if ($this->security['max_size'] < $size)
	  {
		$this->errors[$k][] = $name ."-> O arquivo ultrapassa o tamanho limite de ".$size;
	  }
	}	
	
	return (empty($this->errors[$k])) ? true : false;
  }
  
  /*
  * Getters and other non-essential methods
  */
  
  private function debugger($f)
  {
	echo "<pre>";
	var_dump($f);
	echo "</pre>";
  }
  
  public function getErrors()
  {
	if (!empty($this->errors))
	{
	  $error = '';
	  
	  foreach($this->errors as $er)
	  {
		foreach($er as $v)
		{
		  $error .= $v."<br/>";
		}
	  }
	  
	  return $error;
	}	
  }
}
?>










