Fabyo 66 Denunciar post Postado Junho 20, 2008 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
David Ramires 1 Denunciar post Postado Junho 20, 2008 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
Fabyo 66 Denunciar post Postado Junho 20, 2008 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
David Ramires 1 Denunciar post Postado Junho 20, 2008 Opa... isso ai vai render milhares de visitas..... Compartilhar este post Link para o post Compartilhar em outros sites
roger_php 0 Denunciar post Postado Junho 26, 2008 Ta faltando um tutorial de Zend_Auth.....ai sim fica show!!!!!!!!!! Compartilhar este post Link para o post Compartilhar em outros sites
Fabyo 66 Denunciar post Postado Junho 26, 2008 Opa se der amanha mesmo eu posto um Compartilhar este post Link para o post Compartilhar em outros sites
[VAZA] 0 Denunciar post Postado Abril 9, 2009 Muuuuuito bom messmo!!!!!!!! :D Compartilhar este post Link para o post Compartilhar em outros sites
giulianosaito 0 Denunciar post Postado Abril 11, 2009 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
Fabyo 66 Denunciar post Postado Abril 13, 2009 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
giulianosaito 0 Denunciar post Postado Abril 15, 2009 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
Fabyo 66 Denunciar post Postado Abril 15, 2009 Valeu e tambem fico animado quando vejo que fiz algo util, isso anima e da vontade de postar sempre mais abraços :D Compartilhar este post Link para o post Compartilhar em outros sites