gradient

En esta entrada, explicaremos un sencillo código para guardar imágenes o archivos en el servidor con PHP, lo que suele ser una funcionalidad muy recurrente en sitios web donde se requiere cargar información.

Vamos al código

suponiendo que tenemos dos archivos y una carpeta

  1. index.php: donde estará nuestro formulario, HTML y lo que visualiza el cliente
  2. upload-file.php: donde estará nuestra lógica del lado del servidor.
  3. /files: carpeta en donde cargaremos nuestros archivos, nuestro código puede generarla si no existe

Primero creamos nuestro formulario en el index.php para cargar nuestros archivos, OJO con las etiquetas del formulario:

    <form  action="upload-file.php" method="post" enctype="multipart/form-data">
        <label for="fileTest">Selecciona una imagen/archivo:</label>
        <input id="fileTest" name="fileTest" type="file">
        <button type="submit">Guardar</button>
    </form>
  • action="upload-file.php" : Apuntamos la acción de nuestro formulario al archivo upload-file.php (o a donde tengamos nuestro método de guardado)
  • method="post"
  • enctype="multipart/form-data" : Siempre que enviemos archivos en un formulario seleccionamos este Enctype

Ahora vamos al archivo upload-file.php

<?php

$file = $_FILES["fileTest"]["name"]; //Nombre de nuestro archivo

$url_temp = $_FILES["fileTest"]["tmp_name"]; //Ruta temporal a donde se carga el archivo 

//dirname(__FILE__) nos otorga la ruta absoluta hasta el archivo en ejecución
$url_insert = dirname(__FILE__) . "/files"; //Carpeta donde subiremos nuestros archivos

//Ruta donde se guardara el archivo, usamos str_replace para reemplazar los "\" por "/"
$url_target = str_replace('\\', '/', $url_insert) . '/' . $file;

//Si la carpeta no existe, la creamos
if (!file_exists($url_insert)) {
    mkdir($url_insert, 0777, true);
};

//movemos el archivo de la carpeta temporal a la carpeta objetivo y verificamos si fue exitoso
if (move_uploaded_file($url_temp, $url_target)) {
    echo "El archivo " . htmlspecialchars(basename($file)) . " ha sido cargado con éxito.";
} else {
    echo "Ha habido un error al cargar tu archivo.";
}
?>

¡Hasta aquí lo básico! ya puedes subir cualquier tipo de archivos, pero seguramente querrás poner algunas restricciones, como limite de tamaño o tipo de archivo. Así que veamos el caso:

Validando límite de tamaño de archivo

Creamos una variable $validator para controlar si el archivo se subirá o no.

$validator = 1;

Ahora obtenemos el peso de nuestro archivo mediante su propiedad size y validamos, si el peso del archivo supera 1MB (1000000 Bytes) entonces asignamos cero (0) a $validator.

$file_size = $_FILES["fileTest"]["size"];
if ( $file_size > 1000000) {
  echo "El archivo es muy pesado";
  $validator = 0;
}

Validando tipo de archivo

Ahora validaremos el tipo de archivo, usaremos la misma variable $validator del caso anterior para controlar si el archivo se cargará o no.

Obtenemos la extensión de nuestro archivo a través del método pathinfo(..ARCHIVO.. , PATHINFO_EXTENSION) y usamos strtolower para convertir a minúsculas y facilitar la validación.

$file_type = strtolower(pathinfo($file,PATHINFO_EXTENSION));

Ahora validamos por ejemplo, que nuestro archivo sea una imagen con formato JPG, PNG o GIF

if($file_type != "jpg" && $file_type != "jpeg" && $file_type != "png" && $file_type != "gif" ) {
  echo "Solo se permiten imágenes tipo JPG, JPEG, PNG & GIF";
  $validator = 0;
}

Ahora bien, nuestro código con validaciones quedaría de la siguiente forma:

<?php

$file = $_FILES["fileTest"]["name"]; //Nombre de nuestro archivo

$validator = 1; //Variable validadora

$file_type = strtolower(pathinfo($file,PATHINFO_EXTENSION)); //Extensión de nuestro archivo

$url_temp = $_FILES["fileTest"]["tmp_name"]; //Ruta temporal a donde se carga el archivo 

//dirname(__FILE__) nos otorga la ruta absoluta hasta el archivo en ejecución
$url_insert = dirname(__FILE__) . "/files"; //Carpeta donde subiremos nuestros archivos

//Ruta donde se guardara el archivo, usamos str_replace para reemplazar los "\" por "/"
$url_target = str_replace('\\', '/', $url_insert) . '/' . $file;

//Si la carpeta no existe, la creamos
if (!file_exists($url_insert)) {
    mkdir($url_insert, 0777, true);
};

//Validamos el tamaño del archivo
$file_size = $_FILES["fileTest"]["size"];
if ( $file_size > 1000000) {
  echo "El archivo es muy pesado";
  $validator = 0;
}

//Validamos la extensión del archivo
if($file_type != "jpg" && $file_type != "jpeg" && $file_type != "png" && $file_type != "gif" ) {
  echo "Solo se permiten imágenes tipo JPG, JPEG, PNG & GIF";
  $validator = 0;
}

//movemos el archivo de la carpeta temporal a la carpeta objetivo y verificamos si fue exitoso
if($validator == 1){
    if (move_uploaded_file($url_temp, $url_target)) {
        echo "El archivo " . htmlspecialchars(basename($file)) . " ha sido cargado con éxito.";
    } else {
        echo "Ha habido un error al cargar tu archivo.";
    }
}else{
    echo "Error: el archivo no se ha cargado";
}
?>

Espero que este artículo sobre como guardar imágenes o archivos en el servidor con PHP haya sido de tu utilidad. No dudes en compartirlo con alguien que lo necesite y recuerda que puedes conseguir mas artículos como este en:

Si necesitas mas información sobre el tema:

Angel Mavare

Apasionado por la tecnología y los medios digitales, Ingeniero de software, programador, aficionado a la ilustración y co-fundador de pixonauta.com.

Editado el: 21 octubre, 2023
Suscribirse
Notificar a
guest

4 Comentarios
Más antiguo
El mas nuevo Más votado
Inline Feedbacks
Ver todos los comentarios
Hernando
Hernando
1 year ago

Muy interesante el apunto, me sirvio mucho. Estaban resolviendo este problema de la imagenes y con su aporte saque adelante mi proyecto. Muchas gracias.

enrique
enrique
9 months ago

Hola Muchas Gracias por tu dedicación y compartir con los novatos.

El código funciona, pero yo necesito cambiar la carpeta donde se almacena lo enviado. tampoco se o bien no ubico, donde esta la carpeta /files:
Muchas gracias.