Lenguaje PHP

Cargar imágenes con PHP PDO [Script completo]

Cargar imágenes con PHP PDO. Crearemos un ejemplo completo para subir imágenes al servidor y almacenar los nombres de los archivos en varios registros. Aprenderemos a cargar archivos o imágenes de forma múltiple al servidor con PHP.

¿Como cargar múltiples archivos o imágenes?

Puede almacenar los archivos de imagen en la tabla de la base de datos en formato base64 o en su ruta después de cargarlos.

En el método base64, no es necesario almacenar el archivo cargado en el servidor porque se accede directamente con el valor codificado en base64.

En este tutorial, estoy usando la conexión PDO para almacenar varias rutas de archivos de imagen en la tabla de la base de datos MySQL.

Como funciona Cargar imágenes con PHP PDO

Si deseamos guardar imágenes o archivos en la base de datos, hay 2 formas de hacerlo:

  • Guardando físicamente los archivos en la base de datos usando el formato blob
  • Almacenar el archivo físico en el servidor en una carpeta y guardar una referencia (por ejemplo, la ubicación) en la base de datos.

Pasos importantes para cargar imágenes al servidor

  • La etiqueta form necesita el atributo enctype=»multipart/form-data».
  • El atributo enctype sólo se utiliza el método POST.
  • La etiqueta input tiene que ser de tipo FILE y colocar propiedad multiple=»»
  • Nombre de la etiqueta debe llevar corchetes name=»archivo[]».
  • Declarar la ruta de almacenamiento de los archivos

Requisitos para subir imagenes:

  • Servidor Web.
  • Lenguaje PHP
  • Bootstrap y jQuery (Opcional para la interfaz y/o diseño).
  • HTML5
  • Base de datos MySQL

Estructura de tabla MySQL

En este ejemplo usaremos una tabla para almacenar las imágenes. Además, el ID de la tabla tiene que poseer la propiedad autoincremento para una optima gestiona de la tabla.

CREATE TABLE `images` (
`id` int(11) NOT NULL,
`name` varchar(80) NOT NULL,
`image` varchar(80) NOT NULL,
`date` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp()
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

-- Volcado de datos para la tabla `images`

INSERT INTO `images` (`id`, `name`, `image`, `date`) VALUES
(1, 'bg_1.jpg', 'upload/bg_1.jpg', '2022-08-20 13:55:01');

ALTER TABLE `images`
ADD PRIMARY KEY (`id`);

ALTER TABLE `images`
MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=2;

Configuración PHP & MySQL

Es importante crear un archivo de conexión hacia MySQL y lo llamaremos config.php. Por lo tanto, este archivo contendrá 4 variables primordiales que son las credenciales de MySQL.

Usaremos la extensión PDO que es lo más recomendado por su seguridad y robustez a la hora de manejar conexiones hacia bases de datos.

<?php
$server = "localhost";
$username = "root";
$password = "";
$dbname = "mi_upload";

// Creamos la conexion
try{
$conn = new PDO("mysql:host=$server;dbname=$dbname","$username","$password");
$conn->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
}catch(PDOException $e){
die('Unable to connect with the database');
}

INTERFAZ HTML Y FORMULARIO

Crearemos un archivo llamado index.php y dentro un <formulario>. Además, si manejamos archivos e imágenes, debemos de agregar un input de archivo y un botón de envío. Para habilitar la selección de varios archivos, defina varios atributos en el elemento del archivo.

El formulario tiene que poseer el método POST

Formulario para subir imágenes

Si nuestro form está orientado para cargar imágenes tiene ciertas modificaciones:

  • El Input tienes que ser de tipo File
  • Nombre del campo se cambia y se agregan corchetes [] para definir un array.
  • Se agrega el atributo múltiple al campo.

Código completo

<form method='post' action='' enctype='multipart/form-data'>
<input type='file' name='files[]' multiple />
<input type='submit' value='Submit' name='submit' />
</form>

PROCESO PHP

Crearemos una carpeta para almacenar los archivos de imagen y debe estar declarado en el fichero de proceso del PHP.

Al enviar el formulario el PHP contara el total de archivos seleccionados y cree una declaración preparada para insertar el registro en la tabla de imágenes.

Usaremos el ciclo FOR en los archivos y extraiga la extensión para verificar que el archivo sea una imagen o no.

Si es un archivo de imagen, guárdelo en la carpeta de UPLOAD y ejecute la declaración usando el método de execute() donde pasa una matriz mientras contiene el nombre y la ruta del archivo.

Código completo

<?php
include "config.php";

if(isset($_POST['submit'])){

// Contamos el total de archivos
$countfiles = count($_FILES['files']['name']);

// Preparamos la consulta
$query = "INSERT INTO images (name,image) VALUES(?,?)";

$statement = $conn->prepare($query);

// Enviamos al ciclo todos los archivos
for($i=0;$i<$countfiles;$i++){

// Nombre de archivo
$filename = $_FILES['files']['name'][$i];

// Ruta de almacenamiento de archivos
$target_file = 'upload/'.$filename;

// Obtenemos la extension del archivo
$file_extension = pathinfo($target_file, PATHINFO_EXTENSION);
$file_extension = strtolower($file_extension);

// Validamos la extension del archivo
$valid_extension = array("png","jpeg","jpg");

if(in_array($file_extension, $valid_extension)){

// Cargamos el archivo
if(move_uploaded_file($_FILES['files']['tmp_name'][$i],$target_file)){

// Ejecucion de la consulta SQL
$statement->execute(array($filename,$target_file));

}
}

}
echo "Archivo(s) cargado correctamente";
}
?>

Conclusión

Se requiere un formulario para cargar archivos y el lenguaje php para procesar la información. Sin embargo, PHP carga la imagen al disco del servidor y envía el nombre o referencia de la imagen a la base de datos MySQL.

En este ejemplo hemos almacenado la ruta de los archivos de imagen cargados en la tabla de la base de datos MySQL cuando el archivo se cargó correctamente, pero también puede almacenar el archivo en formato base64 en el campo.

En algunas versiones de PHP suele haber mensajes de notificación por parte del lenguaje PHP a la hora de detectar la extensión del archivo. Por lo tanto, la mejor manera de obtener la extensión es hacer: $file_extension = pathinfo($file_name, PATHINFO_EXTENSION);

Por último, hemos usado el ciclo for para manejar los múltiples archivos cargados en el formulario.

Espero que esta breve información les ayude y no se olviden de compartir en sus redes sociales.

 

Nestor Tapia

Bloggero, amante de la programación PHP, innovador y me fascina compartir información. Desde que conocí el entorno informatico y el internet me llamó la atención la programación, Por tal motivo he creado mi blog BAULPHP.COM para compartir mis experiencias con todos ustedes. ¡Gracias por leerme!.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Botón volver arriba