Desarrollo de Aplicaciones

Gestión de ficheros en Laravel

La estructura principal de carpetas en Laravel incluye 'storage' y 'public', entre otros. En 'storage' es donde se supone que los ficheros que suben los usuarios deben vivir, pero a esta carpeta se le puede hacer un symlink en public para que sean ficheros accesibles por url. 

Gestión de ficheros en Laravel

Ejemplo para gestionar ficheros con Laravel

Por ejemplo, la imagen de un post la pondríamos ahí. Resumiendo mucho podemos pensar que en el controller tenemos algo parecido a:

$post = Post::create($request->all());

$file = $request->file('imagen')

$filename = $file->move(storage_path('app') . '/uploads/images/posts/' . $post->id);

$post->image()->create([

    'src' => '/uploads/images/posts/' . $post->id . '/' . $filename,

    ...

]);

De esta forma y al tener el symlink podremos acceder a "'/uploads/images/posts/' . $post->id . '/' . $filename" y obtendremos nuestra imagen.

Pero, ¿qué pasa si uno de los ficheros que tenemos es una factura? No la podemos guardar de forma que sea accesible por culaquiera que tenga la URL.

Una posible solución es guardarlo en otra carpeta que no sea la que hacemos el symlink, de forma que ese fichero no es accesible desde /public y después hacer una ruta al estilo de:

Route::get('media/{media}', 'MediaController@show');

Y en el controller simplemente hacemos response()->download($media->src). De esta forma, el fichero se descargará directamente, así podremos hacer comprobaciones como 'auth' o 'can' para delimitar que el usuario puede descargar ese fichero en concreto.

Como el ejemplo de las facturas podemos encontrar muchos: desde archivos que dependen de un usuario en concreto o a un grupo o a un atributo del usuario o solo a los usuarios autenticados...

En caso de tener las imágenes en servicios externos (en un FTP, por ejemplo) siempre podemos utilizar Storage para todas estas operaciones.

Comparte este artículo

Artículos Relacionados