La meilleure approche est de créer un lien symbolique comme @SlateEntropy très bien indiqué dans la réponse ci-dessous . Pour vous aider, depuis la version 5.3, Laravel inclut une commande qui rend cela incroyablement facile à faire:
php artisan storage:link
Cela crée un lien symbolique de public/storage
à storage/app/public
pour vous et c'est tout ce qu'il y a à faire. Désormais, tout fichier dans /storage/app/public
est accessible via un lien comme:
http://somedomain.com/storage/image.jpg
Si, pour une raison quelconque, vous ne pouvez pas créer de liens symboliques (peut-être que vous êtes sur un hébergement partagé, etc.) ou si vous souhaitez protéger certains fichiers derrière une logique de contrôle d'accès, il existe une alternative d'avoir une route spéciale qui lit et sert l'image. Par exemple, une route de fermeture simple comme celle-ci:
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;
});
Vous pouvez maintenant accéder à vos fichiers comme vous le feriez si vous aviez un lien symbolique:
http://somedomain.com/storage/image.jpg
Si vous utilisez la bibliothèque d'images d'intervention, vous pouvez utiliser sa response
méthode intégrée pour rendre les choses plus succinctes:
Route::get('storage/{filename}', function ($filename)
{
return Image::make(storage_path('public/' . $filename))->response();
});
AVERTISSEMENT
Gardez à l'esprit qu'en servant manuellement les fichiers, vous subissez une pénalité de performances , car vous parcourez tout le cycle de vie de la requête Laravel afin de lire et d'envoyer le contenu du fichier, ce qui est considérablement plus lent que de le faire gérer par le serveur HTTP.