Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

visitante_php

Avaliacao de classe

Recommended Posts

<?php

/**
 * @author espiritodocoracao@hotmail.com
 * @copyright 2008
 */

class Upload{
	
	public $w;
	public $h;
	public $dir;
	public $type;
	public $file;
	public $resize;
	public $rename;
	public $files;
	public $msg_error;
	public $peso;
	public $peso_msg;
	public $ext_msg;
	public $ext;
	
	protected $error;
	protected $image;
	protected $tipo;
	protected $filetype;
	protected $upload;
	protected $width_orig;
	protected $height_orig;
	protected $imagem;
	protected $imagem_p;
	protected $methodCreateFrom;
	protected $typefile;
	protected $rename_2;
	protected $imagetype;
	protected $upa;
	protected $up;
	protected $pesofile;
	protected $ext_allow;
	
	/** metodo construct faz a verificacao do tipo de arquivo */
	
	public function __construct($file){
		$files = $_FILES["$file"];
		$this->filetype = $files['type'];
		$tipo = explode("/",$this->filetype);
		if($tipo['0'] == 'image'){
			switch($tipo['1']){
				case "jpeg":
				$this->image = "jpeg";
				$this->methodCreateFrom = "imagecreatefromjpeg";
				$this->imagetype = "imagejpeg";
				break;
				case "gif": 
				$this->image = 'gif';
				$this->methodCreateFrom = "imagecreatefromgif";
				$this->imagetype = "imagegif";
				break;
				case "png": $image = "png";
				$this->methodCreateFrom = "imagecreatefrompng";
				$this->imagetype = "imagepng";
				break;
				
			}
			return $this->image;
			return $this->imagetype;
			return $this->methodCreateFrom;	
		}	
		
		return $tipo['1'];
		return $tipo['0'];
		
		
			  
	}
	
	/** metodo para setar o diretorio de destino */
	
	public function setDir($dir){
		if(!is_dir($dir)){
			$dire = mkdir($dir);
			if(!$dire){
				echo "Diretorio setado inexiste/permissao negada para criacao!";
			}else{
				$this->dir = $dir;
				return $this->dir;
			}
		}
		
	}
	
	/** metodo para setar a largura em caso de redimensionamento */
	
	public function setW($w){
		$this->w = $w;
		return $this->w;
	}
	
	/** metodo para setar a altura em caso de redimensionamento */
	
	public function setH($h){
		$this->h = $h;
		return $this->h;
	}
	
	/** metodo para setar o redimensionamento */
	
	public function setRezise($resize = false){
		return $this->resize;		
	}
	
	/** metodo de validacao das extensoes permitidas */
	
	public function setExtAllowed($ext){
		$this->type = explode("/",$this->files['type']);
		if(is_array($ext)){
			if(in_array($this->tipo['1'],$ext)){
				$this->ext_allow = true;
				$this->ext_msg = '';
			}else{
				$this->ext_allow = false;
				$this->ext_msg = "Extensao de arquivo nao permitido";
			}
		}else{
			if($ext == $this->type['1']){
				$this->ext_allow = true;
				$this->ext_allow = '';
			}else{
				$this->ext_allow = false;
				$this->ext_msg = "Extensao de arquivo nao permitido";
			}
		}
		return $this->ext_allow;
		return $this->ext_msg;
	}
	
	/** metodo para renomear o arquivo*/

	public function Rename($rename = 0){
		// 0 => name
		// 1 => date
		// 2 => thumb_name
		// 3 => thumb_date
		// 4 => uniq
		$typefile = explode(".",$this->files);
		switch($this->rename){
			case '0': $this->rename_2 = implode(".",$this->typefile);
			break;
			case '1': $this->rename_2 = date("d_m_Y_H_i_s").".".$this->typefile['1'];
			break;
			case '2': $this->rename_2 = "thumb_".$this->typefile['0'].".".$this->typefile['1'];
			break;
			case '3': $this->rename_2 = "thumb_".date("d_m_Y_H_i_s").".".$this->typefile['1'];
			break;
			case '4': $this->rename_2 = uniqid(md5($this->typefile['0'])).".".$this->typefile['1'];
			break;
		}
		return $this->rename_2;
	}
	
	/** metodo de validacao do envio do upload */
	
	public function setMsg(){
		$this->error = $this->files['error'];
		switch($this->error){
			case UPLOAD_ERR_OK: $this->msg_error = "Upload feito com sucesso!";
			break;
			case UPLOAD_ERR_INI_SIZE: $this->msg_error = "Arquivo maior que o especificado!";
			break;
			case UPLOAD_ERR_FORM_SIZE: $this->msg_error = "Arquivo maior que o especificado pelo formulario!";
			break;
			case UPLOAD_ERR_PARTIAL: $this->msg_error = "Upload realizado parcialmente!";
			break;
			case UPLOAD_ERR_NO_FILE: $this->msg_error = "Sem arquivo definido para upload!";
			break;
		}
		return $this->msg_error;
	}
	
	/** metodo de validacao do tamanho do arquivo */
	
	public function setPeso($peso){
		if($files['size'] > $peso){
			$this->pesofile = false;
			$this->peso_msg = "Peso acima do permitido!";
		}else{
			$this->pesofile = true;
			$this->peso_msg = "";
		}
		return $this->pesofile;
		return $this->peso_msg;
	}
	
	/** metodo para fazer o upload, utilizando as validacoes */
	
	public function Execute(){
		/** se ha arquivo */
		if($_FILES){
			/** valida o tamanho */
			if(self::setPeso($this->files['name'])){
				/** valida as extensoes permitidas */
				if(self::setExtAllowed($ext)){ 
					/** verifica se eh uma imagem */
					if($this->image == "image"){
						/** se foi setado para redimensionar a imagem */
						if($this->resize == true){
							/** redimensiona */
							list($width_orig, $height_orig) = getimagesize($this->files['tmp_name']);
							if ($this->w && ($width_orig < $height_orig)) {
								$this->w = ($this->h / $height_orig) * $width_orig;
							} else {
								$this->h = ($this->w / $width_orig) * $height_orig;
							}
							$imagem_p = imagecreatetruecolor($this->w, $this->h);
							$imagem = $this->methodCreateFrom($this->files);
							imagecopyresampled($imagem_p, $imagem, 0, 0, 0, 0, $this->w, $this->h, $width_orig, $height_orig);
							/** upa a imagem redimensionada */
							$upa = $this->imagetype($imagem_p, $this->dir."/".$this->rename_2, 100);
							if($upa){
								/** se upou emite a mensagem */
								echo self::setMsg();
							}else{
								/** se nao upou emite a mensagem */
								echo self::setMsg();
							}
							/** se nao foi setado para redimensionar a imagem, ou seja, enviar do jeito que e */
						}else{
							/** valida o tamanho em kb */
							if(self::setPeso($this->files['name'])){
								/** valida as extensoes */
								if(self::setExtAllowed($ext)){
									/** upa o arquivo */
									$upa = move_uploaded_file($this->files['tmp_name'], $this->dir."/".$this->rename_2);
									if($upa){
										/** se upou emite a mensagem */
										echo self::setMsg();
									}else{
										/** se nao upou */
										echo self::setMsg();
									}
								}
							}
						}
						/** se nao for imagem */
					}else{
						/** valida a extensao */
						if(self::setExtAllowed($ext)){
							/** valida o tamanho em kb */
							if(self::setPeso($this->files['name'])){
								/** upa o arquivo */
								$upa = move_uploaded_file($files['tmp_name'],$this->dir."/".$this->rename_2);
								if($upa){
									/** se upou emite a mensagem */
									echo self::setMsg();
								}else{
									/** se nao upou */
									echo self::setMsg();
								}
								
							}else{
								echo $this->peso_msg;
							}
						}
					}
				}
			}
		}
	}
}

?>

 

infelizmente nao esta funcionando.... =/

nem emitindo mensagem de erroo. alguem poderia me ajudar...?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você não seguiu os conceitos de encapsulamento ( váriaveis com modificador public,e não notei métodos getters e setters [só passei os olhos] ).

Um erro que notei só passando os olhos foi você ter chamado um método estaticamente ( self:: ),sem o método ser estático.

Sugiro que estude sobre orientação a objetos e refaça sua classe.

 

Edit:

Cara desculpe a sinceridade mas achei sua classe muito zoada.

Concordo,isso só passando os olhos.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Uma coisa boa a se fazer em uma classe é criar uma VAR de ERRO para bloquear outras funções, tipo assim:

 

class classe{
var erro = false;
		 function a(){
				  if(!erro){
					 if(!move_upload()){
					  erro = true;
					  }
				  }
		 }

		 function a(){
				  if(!erro){
					 //execulta função tranquilo
				  }
		 }
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

cara, zoacao aceito so dos mestres....o manual nao falava q o self era estatico.....ha metodos setters sim....ha variaveis que nao sao public...mas obrigado pelas dicas.... essa foi minha primeira classe criada do zero, so com ideias minhas, antes eu so utilizada lcassses prontas ou criava ja com ideias baseadas em outras classes....

 

alguma dica...?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Igor, comece fazendo um trabalho de abstração.

Vejo você se esforçando nesta questão de orientação a objetos, parabéns pelo esforço contínuo.

Comece assim, pense em um objeto imagem, que propriedades (qualidades) e métodos (comportamentos) tem uma imagem.

Crie getters para retornar as propriedades, e setters para setá-las. Faça validações nos setters, pois estes não devem fornecer valores impossíveis para a propriedade em questão. Ex: o objeto não deve permitir definir a propriedade 'largura' para 'abcd', pois espera-se um inteiro.

Exemplo de setter:

$Imagem->setLargura( $largura );
...
public function setLargura( $largura )
{
   $largura = (int)$largura;
   if ( $largura > 0 )
   {
	  $this->largura = $largura;
	  return TRUE;
   }
   return FALSE;
}
...
Exemplo de getter:

...
public function getLargura( )
{
   return $this->largura;
} 
...
E parabéns mesmo por sua dedicação e esforço http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

Marcio...nunca fiz esse tipo de checagem direto no setter,nem dei retorno nos mesmos.

Em apps web,sempre fiz as checagens no controlador (pra não dizer que sou inesperiente em OO,codo em python,java e c++).

Isso ai ta estranho viu.

Compartilhar este post


Link para o post
Compartilhar em outros sites

O conceito de orientação a objetos diz que o objeto possui responsabilidade sobre seus atributos. Então está correto.

O return eu coloquei alí para fins didático. Observe que a forma mais confiável seria o objeto capturar o valor largura do próprio arquivo, e não ser definido.

Compartilhar este post


Link para o post
Compartilhar em outros sites

nao use var, é obsoleto

 

e outra você usa muito "return", e o return será valido somente o primeiro o resto será sempre ignorado.

 

outra coisa sua class tem muitas variaveis, só pra você ter noção o forum invision board tem uma classe de conexao bem completa

e sua classe de upload tem mais variaveis que ela.

Compartilhar este post


Link para o post
Compartilhar em outros sites

eu percebi q tem muitas variaveis....eh pq nao sei se posso usar as mesmas variaveis em mais de um metodo...ae sempre crio variaveis diferentes..... :( ...como ha vi em outros topicos nao usei var....agora classe de conexao eh umacoisa bem simples...eu mesmo ja criei uma com log de erros...e upload envolve mais atributos do que conexao

 

->upload

 

se eh imagem se nao eh..

 

->se for imagem

 

se vai redimensionar ou nao

 

-> se redimensionar

 

q tipo eh a imagem....e dai usar a funcao certa pra isso....

 

se o tamanho do arquivo eh permitido para upload ou nao

 

se a extensao do arquivo eh permitido ou nao....

 

 

marcio leandro, muito obrigado pela paciencia....eh errando que se aprende....

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.