En esta entrada vamos a ver cómo subir archivos con Laravel 5, de paso repasaremos algunos otros temas, enrutar controladores, crear modelos y definir algunas de sus propiedades, utilizar blade y su sistema de herencia y cómo guardar el registro del archivo en base de datos comprobando el tipo de extensión.
Antes de comenzar debemos recordar que para utilizar las clases HTML y FORM en laravel 5 debemos hacer la instalación con composer, a continuación dejo una entrada donde puedes revisar un poco más en profundidad sobre este tema.
Añadir las clases Html y Form en Laravel 5
Simplemente debemos añadir la siguiente línea al archivo composer.json, justamente en la clave require.
1
|
"illuminate/html": "5.*"
|
Ahora para que las dependencias se instalen ejecuta el siguiente comando situado en tu proyecto.
1
|
composer update
|
Abre el archivo config/app.php y añade las siguientes líneas a sus respectivos arrays, primero al providers y después al aliases.
1
2
3
4
5
6
|
//providers
Illuminate\Html\HtmlServiceProvider::class
//aliases
'HTML' => Illuminate\Html\HtmlFacade::class,
'Form' => Illuminate\Html\FormFacade::class,
|
Configurar la conexión a base de datos
Recuerda que el encargado de comunicar los datos de conexión a nuestra aplicación en laravel 5 es el archivo .env que tenemos en la raíz, por lo menos así es por defecto, así que recuerda poner tus datos.
Crear el controlador UploadsController
Para crear nuestro controlador simplemente ejecuta el siguiente comando desde la terminal situado en tu proyecto.
1
|
php artisan make:controller UploadsController --plain
|
Enrutar nuestro controlador en Laravel 5
Enrutar un controlador en laravel 5 es muy sencillo, simplemente debemos ir a nuestro archivo app/Http/routes.php y añadir la siguiente lína.
1
|
Route::controller('uploads','UploadsController');
|
De esta forma, nuestro controlador UploadsController ya habrá sido mapeado correctamente.
Crear la tabla uploads
Sabemos que laravel 5 nos ofrece la posibilidad de trabajar con migraciones para llevar un control de versiones de nuestra base de datos, pero también sabemos que esto no es obligatorio, así que aquí dejo el sql de la tabla uploads, simplemente genera la tabla con ese código.
1
2
3
4
5
|
CREATE TABLE `uploads` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`filename` varchar(60) COLLATE utf8_spanish_ci NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_spanish_ci;
|
Crear el modelo Upload
Para crear el modelo que se va a comunicar con nuestra tabla uploads ejecuta el siguiente comando en la terminal.
1
|
php artisan make:model Upload
|
Ese comando habrá generado un archivo llamado Upload.php en el directorio app, ábrelo y añade el siguiente código.
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
|
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Upload extends Model
{
public $timestamps = false;
protected $table = 'uploads';
/**
* The attributes that are mass assignable.
*
* @var array
*/
protected $fillable = ['filename'];
/**
* The attributes excluded from the model's JSON form.
*
* @var array
*/
protected $hidden = [];
}
|
Una característica importante de este modelo es ver cómo deshabilitamos los timestamps, así Eloquent no seteará created_at ni updated_at.
Ahora abre el controlador UploadsController y añade el método index para renderizar la vista del formulario.
1
2
3
4
|
public function getIndex()
{
return view("uploads.form");
}
|
Antes de seguir con la generación del formulario, crea un archivo llamado master.blade.php en el directorio resources/views y añade el siguiente código.
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
|
<html>
<head>
<title>App - @yield('title')</title>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css">
<style type="text/css">
.btn-file {
position: relative;
overflow: hidden;
}
.btn-file input[type=file] {
position: absolute;
top: 0;
right: 0;
min-width: 100%;
min-height: 100%;
font-size: 100px;
text-align: right;
filter: alpha(opacity=0);
opacity: 0;
outline: none;
background: white;
cursor: inherit;
display: block;
}
</style>
</head>
<body>
<div class="container">
@yield('content')
</div>
</body>
</html>
|
Simplemente definimos varias secciones y damos unos estilos al botón para subir archivos.
Ahora sí, crea el directorio uploads en resources/views y dentro el archivo form.blade.php con el siguiente código.
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
|
@extends('master')
@section('title', 'Uploading files with laravel 5')
@section('content')
<div class="row">
<div class="col-md-10 col-md-offset-1">
<div class="panel panel-default">
<div class="panel-heading">Uploading files with laravel 5</div>
@if (Session::has('success-message'))
<div class="alert alert-success">{{ Session::get('success-message') }}</div>
@endif
@if (Session::has('error-message'))
<div class="alert alert-danger">{{ Session::get('error-message') }}</div>
@endif
<div class="panel-body">
{!! Form::open(array('url' => 'uploads/save', 'method' => 'post', 'files' => true)) !!}
<div class="form-group">
{!! Form::label('file', 'File') !!}
<span class="btn btn-default btn-file">
Select a file {!! Form::file('file') !!}
</span>
</div>
<div class="form-group">
{!! Form::submit('Send', ["class" => "btn btn-success btn-block"]) !!}
</div>
{!! Form::close() !!}
</div>
</div>
</div>
</div>
@stop
|
Es importante darse cuenta que para poder subir archivos necesitamos establecer la propiedad files a true en el método open de nuestro formulario.
Procesar archivos con Laravel 5
Ahora ya podemos procesar el formulario y crear el registro en base de datos, para ello simplemente añade el siguiente método en nuestro controlador UploadsController.
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
|
public function postSave()
{
if(!\Input::file("file"))
{
return redirect('uploads')->with('error-message', 'File has required field');
}
$mime = \Input::file('file')->getMimeType();
$extension = strtolower(\Input::file('file')->getClientOriginalExtension());
$fileName = uniqid().'.'.$extension;
$path = "files_uploaded";
switch ($mime)
{
case "image/jpeg":
case "image/png":
case "image/gif":
case "application/pdf":
if (\Request::file('file')->isValid())
{
\Request::file('file')->move($path, $fileName);
$upload = new Upload();
$upload->filename = $fileName;
if($upload->save())
{
return redirect('uploads')->with('success-message', 'File has been uploaded');
}
else
{
\File::delete($path."/".$fileName);
return redirect('uploads')->with('error-message', 'An error ocurred saving data into database');
}
}
break;
default:
return redirect('uploads')->with('error-message', 'Extension file is not valid');
}
}
|
Antes de explicar este método, ya sabemos que podemos crear nuestros formularios y validarlos con la clase Request en Laravel 5.
Lo primero que hacemos es comprobar que se ha enviado el campo file, en otro caso devolvemos un mensaje diciendo que ese campo es obligatorio.
Después obtenemos la extensión, el mimetype y creamos un nombre para el archivo.
Si tienes problemas a la hora de obtener el mimetype asegúrate que tienes cargada la extensión php_fileinfo en tu php.ini.
En nuestro caso sólo permitimos subir archivos jpg, png, gif y pdf, en otro caso no procesamos el archivo ni el modelo, sino que redirigimos al formulario con un mensaje de error.
Finalmente, comprobamos si el archivo ha subido correctamente, (recuerda crear el directorio files_uploaded dentro de public) con el método isValid(), si ha subido, lo movemos al directorio final y generamos un registro en base de datos relacionado con el archivo subido, al final redirigimos a la vista del formulario con un mensaje satisfactorio.
Comentarios
Publicar un comentario