2015-02-17 11 views
6

Sono nuovo in Laravel e sto provando a memorizzare immagini private in modo che solo gli utenti autenticati possano accedervi. Innanzitutto ho memorizzato le immagini nella cartella Public/UserImages. Ma qui tutte le immagini sono accessibili anche agli utenti non autenticati andando su Inspect Element di chrome e quindi modificando gli ID utente. Gentilmente aiutatemi ...Come gestire le immagini private in laravel 5?

risposta

5

Dipende solo da voi. Si avrà bisogno di essere al di fuori della directory public - io personalmente scelgo resources/uploads o storage/uploads, o memorizzarli off-server completamente utilizzando il cloud filesystem support.

Qualunque cosa si sceglie, avrete bisogno di un percorso che va a prendere il file e lo passa lungo per l'utente dopo aver controllato che abbiano accesso.

+0

Grazie per l'aiuto. :) –

5

seguito è come ho risolto il problema della memorizzazione delle immagini in laravel 5 tale che solo gli utenti autenticati possono visualizzare le immagini. Le persone che non sono autenticate verranno indirizzate a una pagina di accesso. Il mio server è un server Ubuntu/Apache2.

  1. creare la directory/var/www/yourwebsite/app/assets/images

  2. Aggiungi percorso per app/Http/routes.php.

    Route::get('/images/{file}','[email protected]');

  3. Creare un'App Controller/HTTP/Controller/ImageController.php

    <?php 
    namespace App\Http\Controllers; 
    
    use App\Http\Requests; 
    
    use App\Http\Controllers\Controller; 
    
    use Illuminate\Http\Request; 
    
    use Auth; 
    
    class ImageController extends Controller { 
    
        public function __construct() 
        { 
         $this->middleware('auth'); 
        } 
        public function getImage($filename) { 
         $path = '/var/www/YOURWEBSITE/app/Assets/Images/'.$filename; 
         $type = "image/jpeg"; 
         header('Content-Type:'.$type); 
         header('Content-Length: ' . filesize($path)); 
         readfile($path); 
    
        } 
    
    } 
    
  4. a suo avviso si hanno i tag img che hanno:

    src="{{ url('/images/test.jpg') }}" 
    

Questo ovviamente presuppone test.jpg è un file in/var/www/YOURWEBSITE/app/assets/images/

Naturalmente, è possibile aggiungere più logica, come non hardcoding il percorso delle immagini, ecc Questo è solo un semplice esempio per far rispettare l'autenticazione. Notare l'uso del middleware ('auth') nel costruttore del controllore.

+1

Sarebbe molto meglio e consentirebbe al codice di spostarsi da un luogo all'altro se base_path() è stato utilizzato per generare l'inizio del percorso assoluto anziché digitare tutto. –

4

ho avuto lo stesso problema qualche giorno fa e si avvicinò con questa soluzione:

  1. La prima cosa che dovete fare è caricare il file in una directory non pubblico. La mia app sta memorizzando le fatture scansionate, quindi le inserirò all'interno di storage/app/invoices. Il codice per caricare il file e generando l'url sarebbe:

    // This goes inside your controller method handling the POST request. 
    
    $path = $request->file('invoice')->store('invoices'); 
    $url = env('APP_URL') . Illuminate\Support\Facades\Storage::url($path); 
    

    L'url restituito dovrebbe tradursi in qualcosa di simile a http://yourdomain.com/storage/invoices/uniquefilename.jpg

  2. Ora è necessario creare un controller che utilizza la auth middleware per garantire l'utente è autenticato. Quindi, definire un metodo che acquisisce il file dalla directory privata e lo restituisce come una risposta del file.Che sarebbe:

    <?php 
    
    namespace App\Http\Controllers; 
    
    use Illuminate\Support\Facades\Storage; 
    
    class FileController extends Controller 
    { 
    
        public function __construct() 
        { 
         $this->middleware('auth'); 
        } 
    
        public function __invoke($file_path) 
        { 
         if (!Storage::disk('local')->exists($file_path)) { 
          abort(404); 
         } 
    
         $local_path = config('filesystems.disks.local.root') . DIRECTORY_SEPARATOR . $file_path; 
    
         return response()->file($local_path); 
        } 
    } 
    
  3. L'ultima cosa è registrare il percorso all'interno del vostro routes/web.php del file:

    Route::get('/storage/{file_name}', 'FileController')->where(['file_name' => '.*']) 
    

Quindi non lo avete, un frammento abbastanza riutilizzabile per tutti i progetti che si occupa con file privati ​​:)