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.
public
répertoire. De cette façon, vous éviterez de devoir composer une réponse d'image qui pourrait être gérée beaucoup plus rapidement par le serveur HTTP.Une option serait de créer un lien symbolique entre un sous-dossier de votre répertoire de stockage et un répertoire public.
Par exemple
C'est également la méthode utilisée par Envoyer , un gestionnaire de déploiement construit par Taylor Otwell, le développeur de Laravel.
la source
storage
publiquement, généralement les avatars ne nécessitent aucun contrôle d'accès. Si aucune sécurité n'est requise, l'utilisation de toute sorte de middleware ou de route est juste un coup perdu pour vos ressources. Il est également intéressant de noter que depuis Laravel 5.2, il existe un fichier séparé "disque" pour les fichiers publics ( laravel.com/docs/5.2/filesystem ) utilisant des liens symboliques.Selon la documentation de Laravel 5.2, vos fichiers accessibles au public doivent être placés dans le répertoire
Pour les rendre accessibles depuis le Web, vous devez créer un lien symbolique de
public/storage
àstorage/app/public
.Vous pouvez maintenant créer dans votre vue une URL vers les fichiers à l'aide de l'assistant d'actif:
la source
Si vous êtes sous Windows, vous pouvez exécuter cette commande sur cmd:
depuis: http://www.sevenforums.com/tutorials/278262-mklink-create-use-links-windows.html
la source
Tout d'abord, vous devez créer un lien symbolique pour le répertoire de stockage à l'aide de la commande artisan
Ensuite, dans n'importe quelle vue, vous pouvez accéder à votre image via un assistant d'URL comme celui-ci.
la source
Il est bon de sauvegarder toutes les images et documents privés dans le répertoire de stockage, vous aurez alors un contrôle total sur l'éther de fichier, vous pouvez autoriser certains types d'utilisateurs à accéder au fichier ou à restreindre.
Créez une route / docs et pointez sur n'importe quelle méthode de contrôleur:
Lorsque vous frapperez, le
localhost:8000/docs
fichier sera téléchargé s'il en existe.Le fichier doit être dans le
root/storage/app/users/documents
répertoire selon le code ci-dessus, cela a été testé surLaravel 5.4
.la source
Si vous souhaitez charger un petit nombre d' images privées , vous pouvez encoder les images en base64 et les faire écho
<img src="{{$image_data}}">
directement dans :J'ai mentionné privé parce que vous ne devriez utiliser ces méthodes que si vous ne voulez pas stocker des images accessibles publiquement via l'URL, à la place, vous devez toujours utiliser la méthode standard (stockage de lien / dossier public et servir des images avec un serveur HTTP).
Méfiez-vous de l' encodage pour
base64()
avoir deux inconvénients importants:la source
Si vous utilisez php, veuillez simplement utiliser la fonction de lien symbolique php, comme suit:
symlink('/home/username/projectname/storage/app/public', '/home/username/public_html/storage')
changez le nom d'utilisateur et le nom du projet pour les bons noms.
la source
sans nom de site
si vous souhaitez lui ajouter un nom de site, exemple à ajouter sur api JSON felids
la source
Si vous êtes comme moi et que vous avez en quelque sorte des chemins de fichiers complets (j'ai fait des correspondances de motifs glob () sur les photos requises, donc je me retrouve à peu près avec des chemins de fichiers complets), et votre configuration de stockage est bien liée (c'est-à-dire telle que vos chemins avoir la chaîne
storage/app/public/
), alors vous pouvez utiliser mon petit hack sale ci-dessous: p)la source
Si le disque 'local' ne fonctionne pas pour vous, essayez ceci:
'default' => env('FILESYSTEM_DRIVER', 'public'),
partir deproject_folder/config/filesystem.php
php artisan config:clear
php artisan storage:link
Pour obtenir l'URL de l'image téléchargée, vous pouvez utiliser ceci
Storage::url('iamge_name.jpg');
la source