La façon la plus simple d'y parvenir est d'ajouter un nouveau disque. De cette façon, vous pouvez appliquer le nouveau modèle à vos images sans affecter les fichiers et les urls existants, ainsi qu'un certain nombre d'autres avantages.
Étape 1
Ajoutez votre disque à config/filesystems.php :
'images' => [
'driver' => 'local',
'root' => storage_path('app/public/images'),
'url' => env('APP_URL') . '/images',
'visibility' => 'public',
],
Voici un exemple de la façon dont sauvegarder les téléchargements de fichiers à votre nouveau disque depuis un contrôleur :
// storeAs: path, filename, disk
$request->file('image')->storeAs('/', 'x.jpg', 'images')
Et c'est ainsi que vous générez des liens vers l'image qui ressemblent à ceci http://example.com/images/x.jpg
:
Storage::disk('images')->url('x.jpg')
Étape 2
Voici trois options différentes pour servir les fichiers à partir du nouveau chemin ( vous ne devez en choisir qu'un seul ):
Option 1
Créez un lien symbolique dans votre répertoire public.
ln -s /var/www/example.com/storage/app/public/images /var/www/example.com/public/images
Il s'agit de la même méthode que celle utilisée par Laravel pour le disque public par défaut (l'élément /storage
URLs).
A partir de Laravel 7, vous pouvez modifier config/filesystems.php
pour gérer des liens symboliques supplémentaires :
/*
|--------------------------------------------------------------------------
| Symbolic Links
|--------------------------------------------------------------------------
|
| Here you may configure the symbolic links that will be created when the
| `storage:link` Artisan command is executed. The array keys should be
| the locations of the links and the values should be their targets.
|
*/
'links' => [
public_path('storage') => storage_path('app/public'),
public_path('images') => storage_path('app/public/images'),
],
Option 2
Créez une route dans votre application Laravel pour servir les images :
Route::get('images/{file}', function ($file) {
return Storage::disk('images')->response($file);
// or to trigger downloads:
// return Storage::disk('images')->download($file);
});
L'inconvénient de cette option est qu'elle sert chaque image en utilisant un processus PHP, au lieu d'être gérée par le serveur web comme les options 1 et 3.
Option 3
Créez une règle de réécriture dans votre serveur web.
Dans nginx, cela pourrait ressembler à ceci :
location /images/ {
root /var/www/example.com/storage/app/public/;
}
Dans Apache, vous pouvez utiliser un alias :
Alias "/images" "/var/www/example.com/storage/app/public/images"