Laravel 5 - Jak uzyskać dostęp do obrazu przesłanego w storage within View?

Mam avatary użytkownika wgrane do magazynu Laravel. Jak Mogę uzyskać do nich dostęp i renderować je w widoku?

Serwer kieruje wszystkie żądania do /public, więc jak mogę je pokazać, jeśli znajdują się w folderze /storage?

 183
Author: Bogdan, 2015-05-12

12 answers

Najlepszym podejściem jest utworzenie dowiązania symbolicznego, tak jak @SlateEntropy bardzo dobrze wskazał w odpowiedź poniżej. Aby pomóc w tym, od wersji 5.3, Laravel zawiera polecenie , które sprawia, że jest to niezwykle łatwe do wykonania:

php artisan storage:link

Tworzy dla Ciebie dowiązanie symboliczne od public/storage do storage/app/public i to wszystko. Teraz każdy plik w /storage/app/public może być dostępny poprzez link:

http://somedomain.com/storage/image.jpg

Jeśli z jakiegoś powodu nie możesz stworzyć symbolicznego linki (może jesteś na współdzielonym hostingu itp.) lub chcesz chronić niektóre pliki za logiką kontroli dostępu, istnieje alternatywa posiadania specjalnej trasy, która odczytuje i serwuje obraz. Na przykład prosta droga zamknięcia jak ta:

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;
});

Możesz teraz uzyskać dostęp do swoich plików tak, jak byś miał dowiązanie symboliczne:

http://somedomain.com/storage/image.jpg

Jeśli używasz Intervention Image Library możesz użyć jej wbudowanej metody response, aby uczynić rzeczy bardziej zwięzły:

Route::get('storage/{filename}', function ($filename)
{
    return Image::make(storage_path('public/' . $filename))->response();
});

WARNING

Należy pamiętać, że przez ręczne serwowanie plików, które ponosiszkara wydajności , ponieważ przechodzisz przez cały cykl życia żądania Laravel w celu odczytania i wysłania zawartości pliku, co jestznacznie wolniejsze niż posiadanie serwera HTTP.

 369
Author: Bogdan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:10:41

Jedną z opcji byłoby utworzenie dowiązania symbolicznego między podfolderem w katalogu storage a katalogiem publicznym.

Na przykład

ln -s /path/to/laravel/storage/avatars /path/to/laravel/public/avatars

Jest to również metoda używana przez Envoyer , menedżera wdrożeń zbudowanego przez Taylora Otwella, twórcę Laravel.

 52
Author: SlateEntropy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-12 13:28:35

Zgodnie z Laravel 5.2 docs, Twoje publicznie dostępne pliki powinny być umieszczone w katalogu

storage/app/public

Aby uczynić je dostępnymi z sieci, należy utworzyć dowiązanie symboliczne od public/storage do storage/app/public.

ln -s /path/to/laravel/storage/app/public /path/to/laravel/public/storage

Teraz możesz utworzyć w widoku URL do plików za pomocą helpera zasobów:

echo asset('storage/file.txt');
 22
Author: Piotr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-15 20:56:39

Jeśli korzystasz z systemu windows, możesz uruchomić to polecenie NA cmd:

mklink /j /path/to/laravel/public/avatars /path/to/laravel/storage/avatars 

Od: http://www.sevenforums.com/tutorials/278262-mklink-create-use-links-windows.html

 19
Author: cabs,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-30 20:02:56

Najpierw musisz utworzyć dowiązanie symboliczne do katalogu storage używając polecenia artisan

php artisan storage:link

Następnie w dowolnym widoku możesz uzyskać dostęp do swojego obrazu poprzez URL helper w ten sposób.

url('storage/avatars/image.png');
 14
Author: Haider Ali,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-15 10:30:26

Dobrze jest zapisać wszystkie prywatne obrazy i dokumenty w katalogu storage, wtedy będziesz miał pełną kontrolę nad plikiem ether możesz zezwolić pewnemu typowi użytkownika na dostęp do pliku lub ograniczyć.

Utwórz route/docs i wskaż dowolną metodę kontrolera:

public function docs() {

    //custom logic

    //check if user is logged in or user have permission to download this file etc

    return response()->download(
        storage_path('app/users/documents/4YPa0bl0L01ey2jO2CTVzlfuBcrNyHE2TV8xakPk.png'), 
        'filename.png',
        ['Content-Type' => 'image/png']
    );
}

Po naciśnięciu localhost:8000/docs plik zostanie pobrany, jeśli taki istnieje.

Plik musi znajdować się w katalogu root/storage/app/users/documents zgodnie z powyższym kodem, zostało to przetestowane na Laravel 5.4.

 4
Author: Syed Shibli,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-17 17:40:08

Jeśli chcesz załadować małą liczbę prywatnych obrazów , możesz kodować obrazy do base64 i echo ich bezpośrednio do<img src="{{$image_data}}">:

$path = image.png
$full_path = Storage::path($path);
$base64 = base64_encode(Storage::get($path));
$image_data = 'data:'.mime_content_type($full_path) . ';base64,' . $base64;

Wspomniałem o private, ponieważ powinieneś używać tych metod tylko, jeśli nie chcesz przechowywać obrazów publicznie dostępnych za pośrednictwem adresu url ,zamiast tego musisz zawsze używać standardowego sposobu (link storage / public folder i serwuj obrazy z serwerem HTTP).

uwaga kodowanie do base64() mają dwa ważne down strony:

  1. zwiększy to Rozmiar obrazu o ~30%.
  2. łączysz wszystkie rozmiary obrazów w jednym żądaniu, zamiast ładować je równolegle, nie powinno to być problemem dla niektórych małych miniatur, ale dla wielu obrazów Unikaj korzystania z tej metody.
 4
Author: Arash Moosapour,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-17 17:43:21

Jeśli używasz php, po prostu użyj funkcji symlink php, jak poniżej:

symlink('/home/username/projectname/storage/app/public', '/home/username/public_html/storage')

Zmień nazwę użytkownika i nazwę projektu na właściwe nazwy.

 2
Author: dagogodboss,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-06 04:40:29

Bez nazwy strony

{{Storage::url($photoLink)}}

Jeśli chcesz dodać do niej nazwę strony przykład dołączania do api JSON felids

 public function getPhotoFullLinkAttribute()
{
    return env('APP_URL', false).Storage::url($this->attributes['avatar']) ;
}
 1
Author: Jehad Ahmad Jaghoub,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-06-25 19:42:53

Jeśli dysk 'lokalny' nie działa dla ciebie, spróbuj tego:

  1. Zmień lokalny na publiczny w 'default' => env('FILESYSTEM_DRIVER', 'public'), z project_folder/config/filesystem.php
  2. Wyczyść config cache php artisan config:clear
  3. następnie utwórz sym link php artisan storage:link

Aby uzyskać adres URL przesłanego obrazu możesz użyć tego Storage::url('iamge_name.jpg');

 1
Author: Dnyaneshwar Harer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-01-07 13:34:35

Jeśli jesteś taki jak ja i w jakiś sposób Masz pełne ścieżki plików( zrobiłem jakieś dopasowanie wzorca glob() na wymaganych zdjęciach, więc kończę z pełnymi ścieżkami plików), i twoja konfiguracja pamięci jest dobrze powiązana (tzn. tak, że twoje ścieżki mają ciąg storage/app/public/), możesz użyć mojego małego brudnego hack poniżej: p)

 public static function hackoutFileFromStorageFolder($fullfilePath) {
        if (strpos($fullfilePath, 'storage/app/public/')) {
           $fileParts = explode('storage/app/public/', $fullfilePath);
           if( count($fileParts) > 1){
               return $fileParts[1];
           }
        }

        return '';
    }
 0
Author: Damilola Olowookere,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-02-26 19:08:46

Możesz uruchomić to polecenie w konsoli, aby utworzyć link:

php artisan storage:link

Reference link

 0
Author: hammad khan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-08-18 10:11:13