Páginas

domingo, 16 de enero de 2011

UPLOAD de Archivos Con PHP

Retomando el PHP en esta ocasión compartiremos una clase para subir archivos a nuestro sitio Web, para hacer esta operación utilizaremos la función copy, además trabajaremos con un formulario con un campos tipo file y el enctype "multipart/form-data" para trabajar con la variable $_FILE de PHP,  vamos a la acción.


Un UPLOAD de archivos consiste en subir un archivo de nuestra maquina a un Sitio Web alojado en un servidor, como logramos esto?? moviendo el archivo desde nuestra maquina bien sea mediante la funcion copy o move_uploaded_file(), en lo personal me gusta mas trabajar con la funcion copy, para ello seguiremos una serie de pasos que presentamos a continuación:

Lo primero que tenemos que hacer es crear un formulario


Si nos fijamos nuestro formulario además del método de envió, el nombre y la acción tiene un atributo mas que es enctype donde indicamos el tipo de datos que vamos a enviar por defecto este es application/x-www-form-urlencoded, pero cuando necesitamos enviar archivos necesitamos especificar "multipart/form-data" de manera que nuestro servidor entienda que se han enviado archivos mediante este formulario y podemos utilizar $_FILE


Una vez explicado que para poder subir archivos a nuestro servidor debemos usar este tipo de enctype veamos ahora la clase para subirlos y su implementación

/*

clase para subir archivos al servidor

autor: Carlos Belisario

*/
class upload
{
 #atributo para tener los archivos
 private $_file; 
 #atributo para obtener el peso maximo
 private $_maxSize;
 #atributo para obtener el tipo de archivos a subir
 private $_type;
 #atributo para la ruta donde sera subido el archivo
 private $_ruta;
 #iniciamos toda la magia pasamos como parametro el dato $_FILE['campo'],$destino
 public function __construct($file = NULL,$destino = NULL, $validate = array())
 {   
  if(count($file) === 0){
   echo "debe indicar el archivo que desea subir";
  }    
  else{
   $this->_file = $file;
   if(!empty($destino))
    $this->_ruta = $destino.'/'.$file['name'];      
   else
    $this->_ruta = $file['name'];   
   if(is_array($validate)){
    if(count($validate) > 0){
     if(array_key_exists('maximo',$validate))
      $this->_maxSize = $validate['maximo'];
     if(array_key_exists('tipo',$validate)){
      if(is_array($validate['tipo']))      
       $this->_type = $validate['tipo'];
      else
       echo "debe indicar los tipo de archivo en formato array";
     }
     $return = $this->validate();        
    }
   }
   else{
    $return = $this->uploadFile();   
   } 
   echo $return;     
  }
 }
 private function validate()
 {   
  if(file_exists($this->_ruta))
   $return = "el archivo ya existe en el servidor";  
  if(!empty($this->_maxSize)){    
   if($this->_maxSize < $this->_file['size'])    
    $return = "el tamaño del archivo es superior al soportado";
  }
  if(count($this->_type) > 0){  
   $tipo = explode('/',$this->_file['type']);
   if(!in_array($tipo[1],$this->_type))    
    $return = "no esta en el arreglo";         
  }  
  if(empty($return)){      
   $return = $this->uploadFile();   
  } 
  return $return;
 }
 private function uploadFile()
 {
  if(@copy($this->_file['tmp_name'],$this->_ruta))
   return "el archivo fue subido correctamente";  
  else
   return "ha ocurrido un error al subir el archivo ".$this->_file['name']."
 puede que la ruta indicada ".$this->_ruta." no sea correcta";  
 }
}


Si nos fijamos la forma de utilizar esta clase es indicando los parámetros al constructor de nuestras clases y automáticamente según los parámetros que se indiquen el automáticamente subirá el archivo los parámetros que tenemos son los siguientes:

$file: Este parámetro indicamos el valor recibido del formulario por medio de $_FILE de manera que tengamos disponibles todos los índices de este arreglo en nuestra clase.

$destino: En este parámetro indicamos la carpeta destino de nuestro archivo es decir donde quedaran guardados los archivos que subamos por nuestra clase. Si este vacio automáticamente lo guarda en el mismo nivel que esta el archivo en el árbol de carpetas de nuestro sitio.

$validate: Es un arreglo asociativo donde podemos indicar el tamaño máximo y el tipo de archivo que deseamos que sean subidos a nuestro servidor, de manera que si queremos solo JPG lo indicamos este array asociativo está compuesto de la siguiente manera

$validate = array('maximo'=>cantidad_maxima_en_byte,'tipo'=>array('tipoarchivo1',tipoarchivo2)); 


El índice máximo indica el tamaño máximo del archivo que deseamos subir, el índice tipo indicamos los tipos de archivos soportados.

Fácil no??

Pues entonces veamos la implementación

subir.php


require_once(upload.php);
$archivo = $_FILE['campo_archivo'];
$destino = 'Imagenes';
$validate = array('maximo'=>1048576,'tipo'=>array('jpg','png',gif));
$upload = new upload($archivo,$destino,$validate); 

con tan solo indicar los parametros al constructor de nuestra clase podremos subir nuestro archivo al servidor, espero que les sea util, cualquier sugerencia o mejora por favor indicarla y asi como siempre digo aprendemos todos en el caminos hasta una proxima entrada

No hay comentarios:

Publicar un comentario