filesystem-baner

Sin duda alguna la subida de archivos en aplicaciones PHP es siempre un tema que causa algunos problemas. Laravel, sin embargo, trae consigo un potente herramienta que permite manejar de una manera muy fácil estos procedimientos e incluso permite integrar nuestro proyecto con sistemas de almacenamiento no sólo locales sino otros en la nube como Amazon S3 y Rackspace.

En este caso hablaremos del uso básico y manejo de archivos en discos locales.

Configurando el sistema de archivos

Ingresamos config/filesystems.php y  definimos en donde queremos almacenar los archivos a subir, usaremos una carpeta llamada storage dentro del directorio publico de la app.

'local' => [

'driver' => 'local',

'root' => public_path().'/storage',

],

Enviando archivos desde un formulario

Para este ejemplo crearemos un controlador llamado StorageController usando artisan desde la consola de comandos

php artisan make:controller StorageController

una vez que tengamos el controlador debemos crear una ruta para acceder al formulario en el archivo routes.php dentro del directorio app/Http

Route::get('formulario', 'StorageController@index');

y una vista para el formulario llamada new.blade.php que puede quedar de la siguiente forma

@extends('app')

@section('content')

<div class="container">

<div class="row">
  <div class="col-md-10 col-md-offset-1">
    <div class="panel panel-default">
      <div class="panel-heading">Agregar archivos</div>
        <div class="panel-body">
          <form method="POST" action="http://diamond-chaos.codio.io:3000/tuto/public/storage/create" accept-charset="UTF-8" enctype="multipart/form-data">
            
            <input type="hidden" name="_token" value="{{ csrf_token() }}">
            
            <div class="form-group">
              <label class="col-md-4 control-label">Nuevo Archivo</label>
              <div class="col-md-6">
                <input type="file" class="form-control" name="file" >
              </div>
            </div>

            <div class="form-group">
              <div class="col-md-6 col-md-offset-4">
                <button type="submit" class="btn btn-primary">Enviar</button>
              </div>
            </div>
          </form>
        </div>
      </div>
    </div>
  </div>
</div>

@endsection

Es muy importante incluir el atributo enctype=»multipart/form-data» en todos los formularios que incluyan campos de tipo file y recuerda cambiar el action para que apunte a la URL de tu proyecto local.

Nota : en este ejemplo estoy usando como base la plantilla base ‘app.blade.php’ que viene por defecto en laravel.

Dentro de StorageController definimos la funcion view que retornara el formulario

/**
* muestra el formulario para guardar archivos
*
* @return Response
*/
public function index()
   {
      return \View::make('new');
   }

Si ingresamos a la url del formulario podremos ver algo asi

archivoTambién debemos crear la ruta que se encargará de procesar el archivo que deseamos guardar.

Route::post('storage/create', 'StorageController@save');

Procesando archivos en el controlador

El proceso es realmente sencillo y como es costumbre al trabajar con laravel, lo podemos hacer usando tan solo unas pocas lineas de código.

editamos el archivo StorageController dentro de la carpeta app/Http/Controllers

/**
* guarda un archivo en nuestro directorio local.
*
* @return Response
*/
public function save(Request $request)
{

       //obtenemos el campo file definido en el formulario
       $file = $request->file('file');

       //obtenemos el nombre del archivo
       $nombre = $file->getClientOriginalName();

       //indicamos que queremos guardar un nuevo archivo en el disco local
       \Storage::disk('local')->put($nombre,  \File::get($file));

       return "archivo guardado";
}

Obteniendo archivos almacenados

hay muchas formas de obtener estos archivos, una de ellas es crear una ruta genérica que nos permita acceder a cada archivo de la siguiente forma

Route::get('storage/{archivo}', function ($archivo) {
     $public_path = public_path();
     $url = $public_path.'/storage/'.$archivo;
     //verificamos si el archivo existe y lo retornamos
     if (Storage::exists($archivo))
     {
       return response()->download($url);
     }
     //si no se encuentra lanzamos un error 404.
     abort(404);

});

para ver el archivo subido ingresamos a la url tu_url/public/storage/nombre_de_archivo 

Funciones adicionales

Laravel nos ofrece algunas funciones adicionales para el manejo de archivos que pueden ser de gran utilidad

Eliminar uno o mas archivos

Storage::delete('file.jpg');
Storage::delete(['file1.jpg', 'file2.jpg']);

copiar archivos a un nuevo directorio

Storage::copy('old/file1.jpg', 'new/file1.jpg');

Mover archivos a un nuevo directorio

Storage::move('old/file1.jpg', 'new/file1.jpg');

Para mas información no olvides que puedes visitar la documentación oficial de Laravel.

Visita nuestros videotutoriales de Laravel 5 para que aprendas mucho más sobre este poderoso framework de PHP.

Además si quieres aprender aún más a manipular archivos con PHP y Laravel, cuéntanos en los comentarios y por favor comparte el artículo.

Regístrate hoy en Styde y obtén acceso a todo nuestro contenido.

Lección anterior Múltiples bases de datos con Laravel 5 y Eloquent Lección siguiente Envio de correos con Mailgun en laravel 5