Zend_Upload
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.
Discussão (10)
Carregando comentários...