Foros del Web » Programando para Internet » PHP » Frameworks y PHP orientado a objetos »

Clase upload

Estas en el tema de Clase upload en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Hola, estoy creando una clase para subir archivos pero quisiera hacerlo lo más reutilizable posible, lo malo es que los parámetros de mi funcion "Upload()" ...
  #1 (permalink)  
Antiguo 24/03/2010, 11:42
Avatar de cesarpunk  
Fecha de Ingreso: enero-2008
Ubicación: Lima
Mensajes: 943
Antigüedad: 16 años, 10 meses
Puntos: 9
Clase upload

Hola, estoy creando una clase para subir archivos pero quisiera hacerlo lo más reutilizable posible, lo malo es que los parámetros de mi funcion "Upload()" dependen también de los campos demás campos de un formulario (como texfiles combox, etc), quisiera que mi clase sólo devuelva la ruta, el tipo y el peso para poder almacenar estos datos en la BD mediante otro método independiente (quizás de otra clase diferente)... actualmente lo estoy implementando asi:

Código PHP:
<?php
//...

//Método para subir rl archivo al servidor
     
public function UploadFile($nombre,$categoria,$file_upload,$file_name,$file_size,$target_path){
         
//Reporte de Salida : 0(campo vacio), 1(excedio peso), 2(tipo de archivo), 3(existe separata), 4(subio)
     
        
if ($this->validTypeFile($file_name)==true){
            if(
$file_size<1048576){//1MB
                
if (!file_exists($target_path)){                          
                    if(@
move_uploaded_file($file_upload$target_path)){
                    
                        
//guardamos los datos
                        
$size_archivo $this->sizeFile($file_size);
                        
$type_archivo $this->typeFile($file_name);
                        
$saveFile $this->addFile($nombre,$categoria,$target_path,$type_archivo,$size_archivo);
                        if(
$saveFile==true){$report 4;}
                            
                    }else{
$report 0;}
                }else{
$report 3;}/*en esta seccion ingresa el file repetido, en caso de pasar... le mandamos error*/
            
}else{$report 1;}
        }else{
$report 2;}
        
        return 
$report;
     }


     
//Método para registrar el archivo en le BD
     
public function addFile($nombre,$categoria,$raiz_archivo,$tipo_archivo,$peso_archivo){
        
$today date("Y-m-d H:i:s");
        
        
$sql "INSERT INTO archivo(archivo_nombre,categoria_id,archivo_path,archivo_tipo,archivo_peso,archivo_fecha) VALUES('".$nombre."','".$categoria."','".$raiz_archivo."','".$tipo_archivo."','".$peso_archivo."','".$today."');";
        
$result $this->db->ejecutar($sql);
        if(!
$result){    
            exit(
'Perdonen las molestias. Tenemos un problema técnico. Esperamos resolverlo en los próximos minutos');
        }else{return 
true;}
     }
?>
Como en este ejemplo, en la funcion pongo $nombre y $categoria, campos de un formulario, cosa que sólo deberían estar en la funcion addFile() que guarda en la bd, mi intención es que UploadFile() sólo devuelva $target_path,$type_archivo,$size_archivo... pero como retorno estos valores en caso quiera mandarlos a otro método (quizas de otra clase) como array dentro de una variable de sesion? como una instancia? espero me puedan recomendar alguna solución, ya que no quiero estar creando la misma función por cada formulario diferente que tenga un input file.
__________________
Quitenme la vida pero no la bebida.
  #2 (permalink)  
Antiguo 24/03/2010, 12:08
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años, 7 meses
Puntos: 2534
Respuesta: Clase upload

porque no buscas una clase similar en Internet, la lees, la estudias, la analizas, reflexionas e intentas aplicar lo aprendido a tu clase??
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #3 (permalink)  
Antiguo 24/03/2010, 12:46
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 5 meses
Puntos: 2135
Respuesta: Clase upload

Te dejo un ejemplo de una clase que uso:
Código PHP:
Ver original
  1. <?php
  2. //
  3. // +------------------------------------------------------------------------+
  4. // | File Operations                                                                   |
  5. // +------------------------------------------------------------------------+
  6. //
  7.  
  8. require_once dirname(__FILE__) . '/Interface.php';
  9.  
  10. /**
  11.  * File Object
  12.  *
  13.  * @author  Christopher Valderrama <[email protected]>
  14.  */
  15. class File_Upload implements File_Interface
  16. {
  17.     /**
  18.      * The file info array
  19.      * @var array
  20.      */
  21.     private $_file;
  22.    
  23.     /**
  24.      * Creates a new File Object for processing upload files
  25.      *
  26.      * @param string $sFileName
  27.      */
  28.     public function __construct($sFileName)
  29.     {
  30.         if (!isset($_FILES)) {
  31.             throw new Exception('No File upload detected');
  32.         }
  33.         if (!isset($_FILES[$sFileName])) {
  34.             throw new Exception('File ' . $sFileName . ' not found in upload array');
  35.         }
  36.        
  37.         $this->_file = $_FILES[$sFileName];
  38.     }
  39.    
  40.     /**
  41.      * Returns the file name
  42.      *
  43.      * @return string
  44.      */
  45.     public function getName()
  46.     {
  47.         return $this->_file['name'];
  48.     }
  49.    
  50.     /**
  51.      * Returns the file type
  52.      *
  53.      * @return string
  54.      */
  55.     public function getType()
  56.     {
  57.         return $this->_file['type'];
  58.     }
  59.    
  60.     /**
  61.      * Returns the file size
  62.      *
  63.      * @return string
  64.      */
  65.     public function getSize()
  66.     {
  67.         return $this->_file['size'];
  68.     }
  69.    
  70.     /**
  71.      * Returns the file extension
  72.      *
  73.      * @return string
  74.      */
  75.     public function getExtension()
  76.     {
  77.         return strstr('.', $this->getName());
  78.     }
  79.    
  80.     /**
  81.      * Returns the Temporary file name and path
  82.      *
  83.      * @return string
  84.      */
  85.     public function getTemporaryName()
  86.     {
  87.         return $this->_file['tmp_name'];
  88.     }
  89.    
  90.     /**
  91.      * Returns the error code
  92.      *
  93.      * @return integer
  94.      */
  95.     public function getErrorCode()
  96.     {
  97.         return $this->_file['error'];
  98.     }
  99.    
  100.     /**
  101.      * Checks if the file is uploaded correctly
  102.      *
  103.      * @return bool
  104.      */
  105.     public function noErrors()
  106.     {
  107.         return ($this->getErrorCode() == UPLOAD_ERR_OK);
  108.     }
  109.    
  110.     /**
  111.      * Moves the file to a new location
  112.      *
  113.      * @param string $sDestination
  114.      * @param string $sNewFileName
  115.      * @return bool
  116.      */
  117.     public function moveFile($sDestination, $sNewFileName = '') {
  118.         if (!$this->isUploaded()) {
  119.             throw new Exception('Invalid upload file, error code:' . $this->getErrorCode());
  120.         }
  121.        
  122.         if (!is_dir($sDestination)) {
  123.             throw new Exception("Invalid Destination path: $sDestination");
  124.         }
  125.        
  126.         if (empty($sNewFileName)) {
  127.             $sFileName = $this->getName();
  128.         } else {
  129.             $sFileName = $sNewFileName;
  130.         }
  131.        
  132.         return move_uploaded_file($this->getTemporaryName(), $sDestination . '/' . $sFileName);
  133.     }
  134.    
  135.     /**
  136.      * Checks if a file isUploaded
  137.      *
  138.      * @return bool
  139.      */
  140.     public function isUploaded()
  141.     {
  142.         return ($this->noErrors() && is_uploaded_file($this->getTemporaryName()));
  143.     }
  144.    
  145.     /**
  146.      * Cleanup on destruction
  147.      * @return void
  148.      */
  149.     public function __destruct()
  150.     {
  151.         if (file_exists($this->getTemporaryName())) {
  152.             unlink($this->getTemporaryName());
  153.         }
  154.     }
  155. }

Interface:
Código PHP:
Ver original
  1. <?php
  2. //
  3. // +------------------------------------------------------------------------+
  4. // | File Operations                                                                   |
  5. // +------------------------------------------------------------------------+
  6. //
  7.  
  8. /**
  9.  * File Interface
  10.  *
  11.  * @author  Christopher Valderrama <[email protected]>
  12.  */
  13. interface File_Interface
  14. {
  15.     /**
  16.      * Returns the Filename
  17.      * @return string
  18.      */
  19.     public function getName();
  20.     /**
  21.      * Returns the File type
  22.      * @return string
  23.      */
  24.     public function getType();
  25.     /**
  26.      * Returns the File size
  27.      * @return int
  28.      */
  29.     public function getSize();
  30.     /**
  31.      * Moves this file to a new place
  32.      * @param string $sDestination the path file destination
  33.      * @param string $sNewFileName optionally you can pass a new file name
  34.      * @return bool
  35.      */
  36.     public function moveFile($sDestination, $sNewFileName = '');
  37. }

La razón de tener una interface es que también tengo otra clase para trabajar con archivos locales, lo que me da flexibilidad en su uso.

Para usarla hago algo así:
Código PHP:
Ver original
  1. $File = new File_Upload('picture');
  2. $File->moveFile('./uploads');
  3. $sFileName = $File->getName();
  4. $nSize = $File->getSize();

Saludos.

Última edición por GatorV; 24/03/2010 a las 12:51
  #4 (permalink)  
Antiguo 24/03/2010, 15:12
Avatar de cesarpunk  
Fecha de Ingreso: enero-2008
Ubicación: Lima
Mensajes: 943
Antigüedad: 16 años, 10 meses
Puntos: 9
Respuesta: Clase upload

Hola Gatorv, gracias por tu respuesta... entiendo varias cosas de tu clase, está muy interesante. Pero un par de preguntas:

Si tu tuvieras que validar el peso, el tipo u otras cosas... lo harías dentro de la funcion moveFile() o crearías otros métodos para eso?

Y siguiendo con el moveFile() que te retorna el move_uploaded_file() ... un true/false? Porque dependiendo de eso tendría que guardar los registros en la BD.

Yo hacia métodos parecidos al gettype y getsize (como muestro en mi ejemplo) pero para validar el file y retornaba un indicador de error para la validación del formulario. No retornaba el peso u otros valores del file como la haces en esas funciones de interface que por cierto no estaba muy enterado y las comenzaré a aplicar.


Trataré de modificar mi clase al ejemplo que me has mostrado, muchas gracias!
__________________
Quitenme la vida pero no la bebida.
  #5 (permalink)  
Antiguo 24/03/2010, 15:25
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 5 meses
Puntos: 2135
Respuesta: Clase upload

Validar el peso o el tipo ya es parte de la implementación, y como tu comentabas primeramente puede variar en cada proyecto o tipo de requermiento por lo que en ese caso yo extendería la clase y le agregaría un método para checar eso, o hacerlo concretamente en la implementación de la clase.

move_uploaded_file en efecto, regresa true o false dependiendo de si se pudo o no mover el archivo, te recomiendo veas el Manual.

Saludos.

Etiquetas: clase, upload
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 10:04.