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;
}
}
}
?>










