Permitir en nuestros sitios que el usuario pueda colocar archivos en nuestro servidor es una de las tareas mas peligrosas, sin embargo muchas veces necesaria.
Vamos entonces a crear un script que maneje algunas medidas de seguridad al momento de hacer la carga de los archivos.
Creamos un formulario con un campo de tipo archivo al que llamamos “file”
1 2 3 4 |
<form action="subir.php" method="post" enctype="multipart/form-data"> <input type="file" name="file" /> <button type="submit">Subir</button> </form> |
Al especificar enctype=”multipart/form-data” los contenidos de cada archivo se empaquetan para su envío en una sección separada de un documento multiparte.
Ahora procedemos a crear el archivo subir.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
<?php //Se define el tamaño que se permitirá (en KB por eso lo multiplicamos por 1024) $tamanioPermitido = 200 * 1024; //Tenemos una lista con las extensiones que aceptaremos $extensionesPermitidas = array("jpg", "jpeg", "gif", "png"); //Obtenemos la extensión del archivo $extension = end(explode(".", $_FILES["file"]["name"])); //Validamos el tipo de archivo, el tamaño en bytes y que la extensión sea válida if ((($_FILES["file"]["type"] == "image/gif") || ($_FILES["file"]["type"] == "image/jpeg") || ($_FILES["file"]["type"] == "image/png") || ($_FILES["file"]["type"] == "image/pjpeg")) && ($_FILES["file"]["size"] < $tamanioPermitido) && in_array($extension, $extensionesPermitidas)){ //Si no hubo un error al subir el archivo temporalmente if ($_FILES["file"]["error"] > 0){ echo "Return Code: " . $_FILES["file"]["error"] . "<br />"; } else{ //Si el archivo ya existe se muestra el mensaje de error if (file_exists("upload/" . $_FILES["file"]["name"])){ echo $_FILES["file"]["name"] . " already exists. "; } else{ //Se mueve el archivo de su ruta temporal a una ruta establecida move_uploaded_file($_FILES["file"]["tmp_name"], "upload/" . $_FILES["file"]["name"]); echo "Archivo almacenado en: " . "upload/" . $_FILES["file"]["name"]; } } } else{ echo "Archivo inválido"; } ?> |
La variable global $_FILES
El contenido de la variable global $_FILES son los archivos que han sido recibidos por medio un formulario con la encriptación multipart/form-data.
$_FILES[‘nombre_en_el_form’][‘name’]
El nombre original del archivo en la máquina cliente.
$_FILES[‘nombre_en_el_form’][‘type’]
El tipo mime del archivo, si el navegador proporciona esta información. Un ejemplo podría ser “image/gif”. Este tipo mime, sin embargo no se verifica en el lado de PHP y por lo tanto no se garantiza su valor.
$_FILES[‘nombre_en_el_form’][‘size’]
El tamaño, en bytes, del archivo subido.
$_FILES[‘nombre_en_el_form’][‘tmp_name’]
El nombre temporal del archivo en el cual se almacena el archivo cargado en el servidor.
$_FILES[‘nombre_en_el_form’][‘error’]
El código de error asociado a esta carga de archivo. Este elemento fue añadido en PHP 4.2.0
Los archivos, por defecto se almacenan en el directorio temporal por defecto del servidor, a menos que otro lugar haya sido dado con la directiva upload_tmp_dir en php.ini
La función move_uploaded_file
Esta función mueve un archivo subido a una nueva ubicación.
move_uploaded_file ( archivo , destino_y_nombre )
Devuelve TRUE en caso de éxito.
Si filename no es un archivo válido subido, no sucederá ninguna acción, y move_uploaded_file() devolverá FALSE.
Si filename es un archivo subido válido, pero no puede ser movido por algunas razones, no sucederá ninguna acción, y move_uploaded_file() devolverá FALSE. Adicionalmente, se emitirá un aviso.
Recuerde que la ruta donde quiere guardar el archivo debe existir y además debe tener permisos de escritura.
¿Te gustó este artículo?
Si te gustó este artículo, te ha servido o aprendiste algo nuevo; compártelo en tus redes sociales o invítame un cafe.
Hola Michelle, después de subir el archivo hay posibilidad de abir de nuevo el archivo, modificarlo y volverlo a guardar utilizando funciones de php
Claro que si Evelyn, al momento en que tu haces el guardado del archivo con
Debiste asignar la ruta donde quedaría guardado, y de ese modo, con PHP ya puedes acceder al archivo y modificarlo.
Por ejemplo para imágenes es muy común utilizar GD para redimensionarlas y generar los thumbnails.
Hola Michelle, al realizar un $.post con jquery tambien se pueden usar las variables $FILE? Ej. $_FILES[‘nombre_en_el_form’][‘tmp_name’]…
Que tal Juan,
No puede subir archivos directamente con AJAX, pero hay un plugin de jQuery para lo que necesitas.
Se llama jquery.form