Ir para conteúdo

POWERED BY:

Arquivado

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

Fabyo

Zend_Upload

Recommended Posts

Zend Upload

Zend_Form_Element_File

 

Ola turma, atendendo a pedidos, e vendo que existe duvidas na web sobre como criar um campo file para upload

então resolvi criar esse tutorial.

 

a ideia que eu vou mostrar é deixar o sistema do mesmo padrao seguindo os metodos do Zend

como nao existe ate a versao 1.5.2 o elemento file no conjunto Form, iremos criar um.

 

Zend_Form_Element_File

 

<?php
require_once 'Zend/Form/Element/Xhtml.php';

class Zend_Form_Element_File extends Zend_Form_Element_Xhtml
{
public $helper = 'formFile';
}

 

salve nessa pasta:

library\Zend\Form\Element\

 

Optei por retornar erros em exception entao vamos criar um

 

Exception.php

<?php
require_once 'Zend/Exception.php';

class Zend_Upload_Exception extends Zend_Exception
{}

 

crie uma pasta Upload dentro da Zend, ficando esse path:

library\Zend\Upload

 

agora vamos criar um arquivo de configurações, onde podemos definir, extensoes e outras opções

 

config.xml

<?xml version="1.0"?>
<configdata>
<params>
	<pasta>upload</pasta>
	<doc>
		<extention>doc|docx|xls|xlsx|pdf</extention>	
		<max_file_size>2</max_file_size>
	</doc>
	<img>
		<extention>png|jpg|jpeg|gif</extention>
		<max_file_size>2</max_file_size>
	</img>
</params>
</configdata>

 

index.php

<?php
if(version_compare(phpversion(), 5) === '-1'){
die('Versão do PHP não compativel');
}

setlocale(LC_ALL, 'pt_BR');
date_default_timezone_set('America/Sao_Paulo');

define('DS', DIRECTORY_SEPARATOR);
define('PS', PATH_SEPARATOR);

set_include_path('.'
. PS . 'library' . DS
. PS . get_include_path());

require_once 'Zend'.DS.'Loader.php';
Zend_Loader::registerAutoload();

Zend_Registry::set('config', new Zend_Config_Xml('includes'.DS.'config.xml', 'params'));

Zend_Controller_Front::getInstance()
->throwExceptions(TRUE)	
->run('application' . DS . 'controllers');

 

IndexController.php

<?php

class IndexController extends Zend_Controller_Action
{
public function indexAction()
{
	//Faço uma verificação para saber se o php.ini esta com permissao para upload
	if(!(ini_get('file_uploads'))){
		throw new Zend_Upload_Exception("Alerta: file_uploads esta em OFF");
		return $this;
	}	

	$this->view->titulo = 'Upload Zend';
	//crio o formulario com campo file
	$form = new Zend_Form();
	$form->setAttrib('enctype', 'multipart/form-data')  
		 ->setAction('index/upload')  
		 ->setMethod('post');

	$file   = $form->createElement('file', 'file');

	$form->addElement($file)
		 ->addElement('submit', 'upload', array('label' => 'Enviar'));

	$this->view->form = $form;	
}

public function uploadAction()
{
	$this->_helper->removeHelper('viewRenderer');
	//se foi submetido o formulario
	if ($this->_request->isPost()) {
		set_time_limit(0);
		//pego as configurações do arquivo config.xml
		$config = Zend_Registry::get('config');
		//nome da pasta padrao para os uploads
		$pasta  = getcwd().DS.$config->pasta.DS;
		//verifico se a pasta existe e se é uma pasta mesmo
		if (!(is_dir($pasta))){
			//se nao existe tento criar uma ja com permissao de escrita
			if(!(mkdir($pasta, 0777))){
				throw new Zend_Upload_Exception("Alerta: pasta de upload nao existe, e nao pode ser criada");
				return $this;				
			}
		}
		//aqui verifico se a pasta tem permissao de escrita	 
		if(!(is_writable($pasta))){
			throw new Zend_Upload_Exception("Alerta: pasta sem permissao de escrita");
			return $this;			
		}
		//pego o arquivo
		$arquivo = isset($_FILES['file']) ? $_FILES['file'] : FALSE;
		//aqui verifico se o arquivo foi feito o upload ate a pasta temp do servidor
		if(is_uploaded_file($arquivo['tmp_name'])){
			//faço uma verificação basica pra saber se a extensão é valida 
			if(!(preg_match("#\\.({$config->img->extention})$#i", $arquivo['name']))){
				throw new Zend_Upload_Exception("Alerta: extensao invalida");
				return $this;	
			}
			//se quiser fazer upload de arquivos em vez de imagens só trocar a validação
			//$config->doc->extention 

			$get = getimagesize($arquivo['tmp_name']);
			//faço uma verificação confiavel da extensão assim nao tem como o usuario mandar um arquivo qualquer com extensao renomeada
			if($get["mime"] <> "image/png" and $get["mime"] <> "image/gif" and $get["mime"] <> "image/jpeg"){
				throw new Zend_Upload_Exception("Alerta: extensao invalida");
				return $this;				
			}
			//faço o upload, que é a copia da pasta temp do servidor para nossa pasta de upload
			// apenas rescrevo o arquivo para eliminar espaços e trocar por _
			if (move_uploaded_file($arquivo["tmp_name"], $pasta . preg_replace("/\s+/", "_", $arquivo['name']))) {
				print "Upload executado com sucesso!!!<br />";
				Zend_Debug::dump($arquivo);
			} else {
				throw new Zend_Upload_Exception("Alerta: Nao foi possivel fazer o upload para $pasta");
				return $this;						
			}				
		} else {
			// tabela de erros de upload
			$erro = array ( "0" => "upload execultado com sucesso!",
						"1" => "O arquivo é maior que o permitido pelo Servidor",
						"2" => "O arquivo é maior que o permitido pelo formulario",
						"3" => "O upload do arquivo foi feito parcialmente",	 
						"4" => "Não foi enviado nenhum arquivo"
					   );			
			throw new Zend_Upload_Exception("Alerta: ".$erro[$arquivo["error"]]);
			return $this;				
		}
		clearstatcache();
	}		
}	
}

 

index.phtml

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="pt-br" lang="pt-BR">
<head>
<title><?php echo $this->escape($this->titulo);?></title>
<meta http-equiv="Content-Language" content="pt-BR" />
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<meta http-equiv="expires" content="Wed, 26 Feb 1997 08:21:57 GMT" />
<meta http-equiv="pragma" content="no-cache" />
<meta http-equiv="imagetoolbar" content="no" />
<meta http-equiv="Content-Encoding" content="gzip" />
<meta http-equiv="Cache-Control" content="no-cache" />
</head>
<body>
<?php echo $this->form; ?>
</body>
</html>

 

só mais uma dica, usei como exemplo upload de imagens e com isso fica facil verificar o mime da imagem

assim tenho certeza que o arquivo sendo enviado é uma imagem valida e nao um arquivo com extensao de imagem.

 

quando forem usar upload de arquivos voces tbm podem fazer a verificação do mime usando

Fileinfo, antes usava mime_content_type, mas ela se tornou obsoleta.

 

quem tiver interessado só ver esses links:

 

http://br.php.net/manual/pt_BR/ref.fileinfo.php

http://br.php.net/manual/pt_BR/install.pecl.php

http://pecl.php.net/bugs/bug.php?id=7555

http://pt.wikipedia.org/wiki/MIME

 

só uma dica quem quer usar Fileinfo

tem que acrescentar isso no PHP.ini

 

extension=php_fileinfo.dll

extension=php_mime_magic.dll

mime_magic.magicfile = "C:\bin\PHP\extras\magic.mime"

mas nao vamos focar isso nesse tutorial.

 

qualquer duvida só postarem

 

download do sistema completo, menos a pasta library.

Zend_Upload.zip

Compartilhar este post


Link para o post
Compartilhar em outros sites

Legal Fabyo!!!

Boa esse seu tutorial, algumas semanas atrás, eu estava procurando alguma classe

de upload para o Zend, mas como você mesmo disse, até a versão citada por você não tem..

 

Parabéns pelo ótimo tutorial =)

 

http://forum.imasters.com.br/public/style_emoticons/default/clap.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

Valeu

 

uma coisa que me preoculpo é com validação e verificações de erros, porque nao é só fazer funcionar, tem que testar e ter certeza que ira funcionar. ^_^

 

em breve irei postar um tutorial de upload com extjs e barra de progresso

Compartilhar este post


Link para o post
Compartilhar em outros sites

Opa... isso ai vai render milhares de visitas.....

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ta faltando um tutorial de Zend_Auth.....ai sim fica show!!!!!!!!!!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fabyo! Fera demais! Mas eu fiquei com uma dúvida!

Eu apliquei ao meu projeto só que ao invés de criar o uploadAction()

eu coloquei ela em uma classe e a chamo em meu controller! Funcionou direitinho!

O problema que eu estou tendo é como resgatar os atributos do arquivo (nome, tamanho etc) para salvar no banco! Aliás! Eu tenho algumas dúvidas sobre como salvar os dados do formulário inteiro! Tem como me dar uma mãozinha parceiro?

 

 

Obrigado mais uma vez! De muitas que você já me ajudou!

 

PS: outra coisa.. você vai dar continuidade a estes artigos aqui de Zend? A minha base de aprendizado está aqui!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Opa

 

agradeço os elogios, e vou dar continuidade sim, ando meio ausente por causa do trabalho, mas em breve to pra postar coisas novas

 

e sobre sua duvida, posta como você ta fazendo pra eu poder te ajudar melhor

Compartilhar este post


Link para o post
Compartilhar em outros sites

Opa grande! Desculpe-me não responder antes!

 

Eu consegui resolver o problema e entender mais ou menos como funciona essa parte! O zend é fantastico pois não existe uma receita de bolo! Você pega a base mas se ve obrigado a aprender! Isso é muito melhor que receber pronto.

 

Bom Eu fiz simplesmente assim

 

//--UPLOAD
require_once('../library/GSaito/Classes/Upload.php');
$imagem = preg_replace ( "/\s+/", "_", $_FILES['file']['name']);
$upload = new Upload(getcwd () . "/images/up/quemsomos/",$imagem);
//-->

e tudo ficou belezinha!

 

depois eu peguei todos os dados do form com o getValue e mandei salvar $row->save();

 

Obrigado fera! Eu me empolgo ao ver sempre seus tutoriais! E super animado com essa notícia de que você irá continuar postando esses patrimonios! ;)

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.