2017-04-08 1 views
3

Je suis nouveau à Laravel et je me demandais si quelqu'un peut m'aider avec un simple téléchargement d'image.LARAVEL - Affichage des images du dossier de stockage

J'ai un formulaire qui permet à un utilisateur de créer un profil et de télécharger et d'avatar pour son profil au cours du processus. Tout cela fonctionne parfaitement. Voici le code de mon contrôleur:

if (request()->hasFile('avatar')) { 

     $file = request()->file('avatar'); 

     $file->storeAs('avatars/' . auth()->id(), 'avatar.jpg'); 
    } 

L'image est enregistrée Je ne sais pas comment afficher dans Stockage/app/avatars/USER-ID/avatar.jpg

l'image de ce dossier . J'ai cherché des solutions mais je suis incapable d'utiliser php artisan storage:link car ce n'est pas mon serveur. Comment puis-je faire cela sans utiliser le lien de stockage? Puis-je créer un lien manuellement?

Si quelqu'un pouvait m'expliquer une solution qui serait parfaite!

Il suffit de demander si vous avez besoin d'extraits de code.

Merci!

+0

avez-vous obtenu? – developernator

+0

@developernator Je n'ai pas compris – cheesycoder

Répondre

3

Vous aurez besoin d'accéder aux fichiers protégés à l'aide d'une route dans les bouchons un contrôleur qui peut accéder aux fichiers et le transmettre à la vue.

Je recommande également d'utiliser le package intervention/image il peut être installé par

composer require intervention/image

Voir ci-dessous pour accéder à l'image:

// Votre itinéraire dans web.php

// Public route to show user avatar 
Route::get('avatars/{id}/{image}', [ 
    'uses'  => '[email protected]' 
]); 

// Dans votre fichier de contrôleur.Dans cet exemple, selon le nom de ce que nous avons ci-dessus, il serait userProfileAvatar()

namespace App\Http\Controllers; 

use Illuminate\Http\Request; 
use Image; 

class TheNameOfYourController extends Controller 
{ 

    /** 
    * Show user avatar 
    * 
    * @param $id 
    * @param $image 
    * @return string 
    */ 
    public function userProfileAvatar($id, $image) 
    { 
     return Image::make(storage_path() . '/avatars/' . $id . '/' . $image)->response(); 
    } 

} 

// Votre point de vue de la lame pour afficher l'image

<img src="images/profile/{{ \Auth::user()->id }}/avatar.jpg" alt="{{ \Auth::user()->name }}"> 

Voici quelques références mais ce intances qui vont un peu plus loin et enregistrez le chemin du fichier la base de données sur le téléchargement:

// Route Exemple

// Exemple contrôleur

// Voir exemples

+0

Merci beaucoup pour l'explication, vous avez été d'une grande aide! Les références sont fantastiques aussi. Merci encore. – cheesycoder

0

Créer un lien symbolique qui reliera storage/app et public/img répertoires, par exemple:

ln -s /home/laravel/public/img /home/laravel/storage/app 

aide Ensuite, il suffit d'utiliser asset() pour générer un lien:

<img src="{{ asset('img/avatars/'.auth()->id().'/avatar.jpg') }}"> 
+0

Y a-t-il un moyen de créer un lien moi-même? Je n'ai pas accès à la ligne de commande – cheesycoder

1

Eh bien, si vous n'avez pas accéder au serveur pour créer un lien symbolique, vous devez créer une route qui renvoie l'image en réponse.

Quelque chose comme ça:

Route::get('storage/{filename}', function ($filename) 
{ 
    $path = storage_path('avatars/' . $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; 
});