Comunidad PHPeros
Lenguajes => PHP => (POO) Programación Orientada a Objetos => Mensaje iniciado 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.
<?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
-
esta linea es muy peligrosa
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