Bonsoir à tous.

Depuis mes controllers, j'arrive à stocker des images dans le dossier storage/app/public/images :

$path = $request->file('image')->storeAs('public/images', $nameToStore);

J'ai bien pris le soin de faire un storage:link en php car j'ai pas accès ssh. Mon fichier symlink.php dans le dossier public de Laravel :

$target = '/home/globalecpr/www/storage/app/public';
$link = '/home/globalecpr/www/public/storage';
symlink($target, $link);
echo readlink($link);

et tout se passe bien car j'obtiens un lien symlink storage dans le dossier public de Laravel.

Dans ma vue :

<img src="{{asset('storage/images/' . $article->image)}}" class="img-responsive">

Comme résultat l'image ne s'affiche pas pourtant elle est bien présente dans le dossier storage/app/public/images. Pourtant en local tout marchait à la perfection dans mon wamp.

NB. Je suis sur un mutualisé ovh, pas d'accès ssh.

Merci d'avance...

21 réponses


Bonjour,

Test soit avec la façade Storage : Storage::disk('[nom-de-ton-disk]')->url('[url]'); soit sans le "storage" : <img src="{{asset('images/' . $article->image)}}" class="img-responsive">

https://laravel.com/docs/5.5/filesystem

En esperant t'aider

Kévin Labre

Bonjour KevinLbr,
Merci déjà pour ce retour.

Storage::disk('[nom-de-ton-disk]')->url('[url]');

Ce code permet de faire quoi ? En outre test sans le "storage" ca veut dire quoi ?

Pour une bonne précision, je n'arrive pas à afficher dans les vues, les images du storage.

Merci d'avance...

Ce code permet de récuperer une url d'une fichier accessible publiquement, car tout ce qui n'est pas dans le dossier public n'est pas accessible par l'utilisateur

Donc 2 solutions :

  • soit celle que je viens de te mentionner avec la façade storage
Storage::disk('[nom-de-ton-disk]')->url('[url]');

Note: Pour savoir quel est le disk ou sont stocké tes fichiers, tu peux aller jeter un coup d'oeil dans config/filesystems.php et regarder ton disk par defaut. Normalement si tu n'as pas spécifié de disk lors de l'upload, tu peux utiliser :

Storage::url('[url]');

Il prendra le disk par defaut dans ce cas la. Et tu pour etre sur que ton disk et bien celui par defaut (le local si tu n'as rien changé), tu peux regarder son url dans le meme fichier :

        'local' => [
            'driver' => 'local',
            'root' => storage_path('app'),
        ],

Qui correspond à storage/app/

  • soit tu utilise le lien symbolique qui lui est dans le dossier public mais qui redirige dans le dossier storage :
<img src="{{asset('/images/' . $article->image)}}" class="img-responsive">

Qui fera reference à storage/images/

En esperant t'avoir aidé

KevinLbr,
J'ai essayé des 2 solutions. Aucune n'affiche l'image.
Voici le lien https://saed.ovh/storage/images/da16db98ddabeae42495ff003d1efbc8_1518456885.jpg généré par

{{asset('/images/' . $article->image)}}

En appelant ce lien depuis le navigateur j'ai cette erreur :
Forbidden
You don't have permission to access /storage/images/da16db98ddabeae42495ff003d1efbc8_1518456885.jpg on this server.

Est-ce le dossier storage necessite certaines permissions d'accès ?

Voici une capture du ftp pour observer le lien symbolic https://saed.ovh/img/ftp.jpg.

Merci d'avance...

Comme je te l'ai dis, le dossier storage n'est pas accessible depuis l'extèrieur.

J'ai vu que tu stock tes images dans 'public/images', qui correspond à storage/public/images, hors l'url storage/public est utilisé par le disk 'public' (tu peux aller vérifer dans config/filesystem.php), donc essaie avec

Storage::disk('public')->url("{$article->image}")

Dis moi s'il te plait que contient $article->image

Kevin

D'ailleurs, dans une vue il faut mieux utilisé asset(), et pour reprendre ton url, essaie avec :

{{ asset("images/{$article->image}") }}

config/filesystem.php)

'disks' => [

        'local' => [
            'driver' => 'local',
            'root' => storage_path('app'),
        ],

        'public' => [
            'driver' => 'local',
            'root' => storage_path('app/public'),
            'url' => env('APP_URL').'/storage',
            'visibility' => 'public',
        ],

et

Storage::disk('public')->url('images/'.$article->image)

renvoie :

https://www.saed.ovh/storage/images/da16db98ddabeae42495ff003d1efbc8_1518456885.jpg

or le path c'est storage/app/public/image.

$article->image renvoit da16db98ddabeae42495ff003d1efbc8_1518456885.jpg nom de l'image dans la bdd.

Parcontre, ce code marche super bien en local.

Est-ce le dossier ne requiert pas certaines permissions ?

Merci d'avance...

Voici mon symlink

$target = '/home/globalecpr/www/storage/app/public';
$link = '/home/globalecpr/www/public/storage';
symlink($target, $link);

Essaie

Artisan:command('storage:link');

Pour faire le lien.

Mais comment tu fais pour installer ton projet et tout configurer si t'as pas d'acces ssh ?

Voilà comment installer et configurer Laravel sans accès ssh https://www.youtube.com/watch?v=6g8G3YQtQt4&list=PLillGF-RfqbYhQsN5WMXy6VsDMKGadrJ-&index=13.

Comme solution alternative, est-ce il serait possible de stocker mes images directement dans public pour leur accès facile ?

$path = $request->file('image')->storeAs('public/images', $nameToStore);

Comment modifier ce script pour qu'il sauvegarde directement dans public qui est accessible.

Merci d'avance...

Il faudrait que tu donne les droits d'acces au dossier storage mais ça va etre compliqué si tu n'as pas d'accès ssh, donc oui tu peux stocker tes images dans le dossier public.

Rajoute dans config/filesystem, en dernier disks:

        'uploads' => [
            'driver' => 'local',
            'root' => public_path('uploads'),
        ],

puis maintenant, soit tu utilise:

Storage::disk('uploads')->storeAs('images', $request->file);

Il seront stocké dans publc/uploads/images
Et pour les récuperer :

Storage::disk('uploads')->get('images/'.$article->image);

ou

src="/uploads/images/{$article->image}"

ou tu peux faire un setter dans ton model :

  public function setImageAttribute($value)
  {
    if(is_file($value)) {
      $attribute_name = "image";
      $disk = "uploads";
      $destination_path = "images";

      $this->uploadFileToDisk($value, $attribute_name, $disk, $destination_path);
    }

      $this->attributes['image'] = $value;
  }

Je t'avoue que stocker des fichiers dans le dossier public qui ne sont pas utilisé pour le design du site, c'est pas top top... mais bon

Nous testons l'application et c'est mon premier bébé avec Laravel. Quand nous passerons à l'hébergement finale, le ssh serait une priorité.
Merci beaucoup. je teste et je reviens vers vous.

Mon cher KevinLbr, le fait de faire storage:link revient à stocker les images dans le dossier public. C'est mon impression !

KevinLbr, quels droits doit-on donner au dossier storage ? Je peux contacter l'hébergeur.

Oui le ssh est vraiment primordial avec Laravel !

Storage Link sert a faire un lien symbolique du dossier storage/app/ vers /public/storage, mais les fichiers sont bel est bien stocké dans /storage/app ;)

Il faut tout les droits pour se dossier

N'hésitez pas a me demander de l'aide pour un autre probleme sur Laravel si vous avez besoin

Mais avec mon logiciel de FTP, je peux faire un 777 sur ce dossier de facon récursive.

Merci d'avance pour votre aide.

Bonsoir KevinLbr,
J'essaie ceci :

$path = Storage::disk('uploads')->storeAs('images', $request->file('image'));

J'ai cette erreur : InvalidArgumentException
Driver [] is not supported.

J'ai au préalable ajouter ceci dans config/filesystem:

'uploads' => [
            'driver' => 'local',
            'root' => public_path('uploads'),
        ],

Quel pourrait être le problème ?

Merci d'avance...

tu dois mentionner ton driver en disk :

Storage::disk('local')

J'ai fait ainsi et ca marche :
Controller

 $path = Storage::disk('uploads')->putFileAs('images', $request->file('image'), $nameToStore);

View

 <img src="{{asset('/uploads/images/' . $article->image)}}" class="img-responsive"> 

La meilleure solution aurait été de stocker dans storage et faire un symlink. Hélas ca n'a pas marché.

Merci beaucoup.

Bonsoir à tous,
Ce code ne marche pas. Comment supprimer un fichier dans le dossier public ?

Storage::disk('uploads')->delete('images/'.$article->image);

Merci d'avance...

Bonjour,

Sache que ta methode est la bonne, donc c'est soit ton disk, soit ton url qui est faux/sse

essaie :

Storage::disk('local')->delete('images/'.$article->image);