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
?
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.
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.
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');
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
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');
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
.
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:
- zwiększy to Rozmiar obrazu o ~30%.
- łą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.
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.
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']) ;
}
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:
- Zmień lokalny na publiczny w
'default' => env('FILESYSTEM_DRIVER', 'public'),
zproject_folder/config/filesystem.php
- Wyczyść config cache
php artisan config:clear
- 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');
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 '';
}
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
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