El mejor enfoque es crear un enlace simbólico como @SlateEntropy muy bien señalado en la respuesta a continuación . Para ayudar con esto, desde la versión 5.3, Laravel incluye un comando que hace que esto sea increíblemente fácil de hacer:
php artisan storage:link
Eso crea un enlace simbólico de public/storage
a storage/app/public
para ti y eso es todo. Ahora /storage/app/public
se puede acceder a cualquier archivo en un enlace como:
http://somedomain.com/storage/image.jpg
Si, por algún motivo, no puede crear enlaces simbólicos (tal vez está en un alojamiento compartido, etc.) o desea proteger algunos archivos detrás de alguna lógica de control de acceso, existe la alternativa de tener una ruta especial que lea y sirve la imagen. Por ejemplo, una ruta de cierre simple como esta:
Route::get('storage/{filename}', function ($filename)
{
$path = storage_path('public/' . $filename);
if (!File::exists($path)) {
abort(404);
}
$file = File::get($path);
$type = File::mimeType($path);
$response = Response::make($file, 200);
$response->header("Content-Type", $type);
return $response;
});
Ahora puede acceder a sus archivos tal como lo haría si tuviera un enlace simbólico:
http://somedomain.com/storage/image.jpg
Si está utilizando la Biblioteca de imágenes de intervención , puede usar su response
método integrado para hacer las cosas más concisas:
Route::get('storage/{filename}', function ($filename)
{
return Image::make(storage_path('public/' . $filename))->response();
});
ADVERTENCIA
Tenga en cuenta que al servir manualmente los archivos está incurriendo en una penalización de rendimiento , ya que está atravesando todo el ciclo de vida de la solicitud de Laravel para leer y enviar el contenido del archivo, que es considerablemente más lento que hacer que el servidor HTTP lo maneje.