Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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.
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
Opa... isso ai vai render milhares de visitas.....
Ta faltando um tutorial de Zend_Auth.....ai sim fica show!!!!!!!!!!
Opa
se der amanha mesmo eu posto um
Muuuuuito bom messmo!!!!!!!!
:D
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!
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
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);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! ;)
Valeu
e tambem fico animado quando vejo que fiz algo util, isso anima e da vontade de postar sempre mais
abraços :D
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