septiembre 2017

Pedro Lara {Dev}

Código, Libros y Podcast

Subir múltiples imágenes con laravel

No hay comentarios
Pedro Lara
22 - 09 - 2017








En esta ocasión vamos a ver cómo podemos subir varias imágenes simultáneamente a nuestro servidor y guardarlas en una base de datos de Mysql usando Laravel.
Empecemos:

Para este ejemplo vamos a utilizar un formulario HTML  bastante sencillo ya que  contendrá  sólo un imput: images. Sin embargo las imágenes también pueden ser  enviadas a través  de  una aplicación móvil y va a funcionar.

<html>
<head>
<title>Subir imágenes</title>
</head>
<body>

/*Ahora llamamos el action que se encargará de procesar las imágenes que vamos a enviar a nuestro servidor. Para poder enviar las imágenes es necesario colocar enctype="multipart/form-data"  para indicarle al navegador que estamos enviando varios archivos.*/

<form  action=" miservidor.com/UploadImage" method="post"  enctype="multipart/form-data"  >

/*Para poder subir imágenes nuestro input debe ser de tipo file y además debemos indicar que es un array images[] */
<INPUT type="file" name=" images[]">
<br>
<INPUT type="submit" name="enviar" value="enviar" >
</form>
</body> </html>

 Ahora vamos a crear la función que recibirá las imágenes en nuestro servidor, las moverá a una carpeta y guardará el nombre en la base de datos de Mysql. Pero antes debemos crear el endpoint en nuestro archivo de rutas:

Route::post(' UploadImage','ImageController@store');

Como puede observarse, en la ruta anterior hemos hecho referencia a un controlador llamado ImageController  y a su método store. En  consecuencia debemos crear este controlador con su  método. Esto lo podemos hacer con la siguiente sentencia desde la línea de comandos:

php artisan make:controller ImageController

 Esta sentencia nos creará un controlador con el nombre indicado (ImageController). Ahora dentro del controlador creamos la función store la cual  procesará nuestras imágenes:

public function store( Request $request){
                }

También es necesario crear la tabla en nuestra base de datos y su respectivo modelo para guardar el nombre de las imágenes.Para crear un modelo en laravel debemos de ejecutar la siguiente sentencia desde la linea de comandos:

php artisan make:model User

La sentencia anterior nos creará un modelo el cual usaremos para hacer crud a nuestra tabla de imágenes. 

Ya que tenemos creado nuestro modelo, nuestra tabla y nuestro controlador, pasemos ahora a trabajar con el método que procesará nuestras imágenes. 

El usuario puede enviar  sólo una  imagen, pero puede enviar más de una. Así que, para acceder a cada una de las imágenes en caso de que el usuario envié varias, vamos a crear un bucle foreach:

foreach ($request->file('imagen') as $file) {
                }

Dentro de este bucle lo primero que hacemos es colocarle un nombre a cada una de las imágenes que recibimos:

$filename= 'collection_'.time().$file->getClientOriginalName();

En este ejemplo le he colocado el prefijo  'collection_' más la hora en formato unix con la función  time(). Además le he concatenado el nombre original de la imagen con la función getClientOriginalName(). Esto es  para tratar que no se repitan los nombres de las imágenes. Sin embargo, existen otros métodos para colocarle prefijos aleatorios. Cada uno debe escoger el que más les convenga.

Luego procedemos a mover las imágenes a una carpeta que ya debemos haber creado dentro del directorio público de Laravel:

$file->move('Files/', $filename);

Para saber exactamente donde se encuentra la carpeta publica de nuestro proyecto podemos hacer uso de la función public_path().  Y dentro de la ruta que nos devuelve esta función creamos un directorio para guardar nuestras imágenes. En este  caso, hemos creado un directorio de nombre Files dentro de la carpeta Public.

Lo que sigue es guardar el nombre completo (nombre+ ruta)  de nuestras imágenes dentro la base de datos. Otra opción sería guardar las imágenes como base64, pero en este ejemplo  prefirimos guardar sólo el nombre. Para esto inicializamos nuestro  modelo:

$filemodel=new Image;

Guardamos el nombre:

$filemodel->name=$filename;

Posteriormente, validamos que las imágenes se hayan guardado:

if ($filemodel->save()) {
                    $response['success'] = 'true';
                    $response['message'] = 'images Added Successfully!';
                } else {
                    $response['success'] = 'false';
                    $response['message'] = 'Error in saving data try again!';
                }

Al final nuestra función quedaría de la siguiente manera:

public function store( Request $request){
foreach ($request->file('imagen') as $file) {
  $filename= 'collection_'.time().$file->getClientOriginalName();
  $file->move('Files/', $filename);
  $filemodel=new Image;
  $filemodel->name=$filename;
  if ($filemodel->save()) {
                    $response['success'] = 'true';
                    $response['message'] = 'images Added Successfully!';
                } else {
                    $response['success'] = 'false';
                    $response['message'] = 'Error in saving data try again!';
                }


}
return json_encode($response);  


Todo muy fácil, hasta la próxima


Videos relacionados



No hay comentarios :

Publicar un comentario