Comunidad PHPeros

Lenguajes => PHP => (POO) Programación Orientada a Objetos => Mensaje iniciado por: Focux en 20 de Mayo de 2010, 23:02:52 pm

Título: [CLASS] File Upload
Publicado por: Focux en 20 de Mayo de 2010, 23:02:52 pm
Estaba aburrido y hize una clase para subir archivos, cualquier duda & pregunta sólo digan.
Citar
<?PHP
/*
8888888888    .d88888b.      .d8888b.     888     888    Y88b   d88P
888          d88P" "Y88b    d88P  Y88b    888     888     Y88b d88P 
888          888     888    888    888    888     888      Y88o88P   
8888888   888     888    888           888     888       Y888P   
888          888     888    888           888     888       d888b   
888          888     888    888    888    888     888      d88888b   
888          Y88b. .d88P    Y88b  d88P    Y88b. .d88P     d88P Y88b 
888           "Y88888P"      "Y8888P"      "Y88888P"    d88P   Y88b
                                                         

Autor: Focux
Titulo: File Upload
Version: 0.1

Modo de uso:
$subir = new fileUpload(directorio(dejalo vacio si es en el directorio donde esta el script),tamaño maximo(dejalo vacio y cojera por defecto 1000),array con extensiones permitidas);
$subir->checkFiles() //Esta funcion sube el archivo
$subir->showError(); //Esta funcion muestra el error

Ejemplo:
<?php
if(isset($_POST['ok'])){
require_once('upload.php');
$subir = new fileUpload('algo/','1000',Array("rar","txt"));
$subir->checkFiles();
$subir->showError();
}
?>
<form method="post" enctype="multipart/form-data">
<input type="file" name="subir"/>
<input type="submit" name="ok"/>
</form>

Otros:
Hize todas las variables publicas por si quieren mostrar en algún lugar el tamaño máximo y otras cosas etc.
*/
class fileUpload {
    public $folder; //Creamos las variables
    public $maxSize;
    public $allowedFiles;
    private $error;
    public function __construct($folder = '', $maxSize = "1000", $allowedFiles) { //Agregamos el constructor, en caso de dejar los campos vacío tomara los valores por defecto que se encuentra arriba.
        $this->folder = $folder; //Le damos el valor a cada variable
        $this->maxSize = $maxSize;
        $this->allowedFiles = $allowedFiles;
    }
    public function checkFiles() {
        foreach($_FILES as $some => $result) { //Con este foreach obtenemos el nombre del campo $_FILES
            foreach($_FILES[$some] as $name => $valor) { //Con este foreach extraemos los datos de la superglobal $_FILES
                eval('$this->' . $name . '= \'' . $valor . '\';'); //Los datos obtenidos los guardamos en variables
            }
        }
        if ($this->size > $this->maxSize) { //Verificamos si el peso del archivo supera lo maximo establecido, si lo supera pasamos el error.
            $this->error = 1;
            return false;
        } else {
            if (!in_array(end(explode('.', $this->name)), $this->allowedFiles)) { //Verificamos si la extensión permitida se encuentra en las establecidas.
                $this->error = 2;
                return false;
            } else {
                if (@file_exists($this->folder . sha1_file($this->tmp_name) . time() . $this->name)) { //Verificamos si el archivo existe.
                    $this->error = 3;
                    return false;
                } else {
                    if (!@copy($this->tmp_name, $this->folder . sha1_file($this->tmp_name) . time() . $this->name)) { //Copiamos el archivo al servidor.
                        $this->error = 3;
                        return false;
                    } else {
                        $this->error = 4;
                        return true;
                    }
                }
            }
        }
    }
    public function showError() { //Esta función muestra el error.
        switch ($this->error) { //Con el switch mostramos el error mediante los datos obtenidos anteriormente
            case 1:
                echo 'Tu archivo supera los limites permitidos (' . $this->maxSize . ')';
            break;
            case 2:
                echo "La extensión de tu archivo no es permitida";
            break;
            case 3:
                echo "Hubo un error al subir el archivo, intentelo de nuevo";
            break;
            case 4:
                echo "Archivo subido con exito";
        }
    }
}
?>

Link de prueba: http://focux.zobyhost.com/uplo.php
Título: Re:[CLASS] File Upload
Publicado por: hansphp en 30 de Junio de 2010, 02:36:05 am
esta linea es muy peligrosa
Código: [Seleccionar]
eval('$this->' . $name . '= \'' . $valor . '\';'); //Los datos obtenidos los guardamos en variables;Estube analizando el codigo y pude realizar una ejecución remota e incluso se puede cambiar que extension permite el script.

sustituyelo por :

 $this->$name= $valor; //Los datos obtenidos los guardamos en variables

un clásico puntero