Доступ к изображениям Laravel за пределами общедоступной папки

Мне нужно хранить изображения в бэкэнд для зарегистрированных пользователей. Сохраненные изображения должны быть защищены и не видны снаружи (общедоступны). Для этого я выбрал папку «storage».

Я придумал это в своем контроллере:

public function update(Request $request, $id) { //Show the image echo '<img src="'.$_POST['img_val'].'" />'; //Get the base-64 string from data $filteredData=substr($_POST['img_val'], strpos($_POST['img_val'], ",")+1); //Decode the string $unencodedData=base64_decode($filteredData); //Save the image $storagepath = storage_path('app/images/users/' . Auth::user()->id); $imgoutput = file_put_contents($storagepath.'/flyer.png', $unencodedData); return view('backend.flyers.index')->withImgoutput($imgoutput) //->withStoragepath($storagepath); } 

после нажатия кнопки сохранения, которая запускает обновление (), я могу видеть изображение в своем представлении и оно также сохраняется в моей папке (текущие пользователи = 10) «storage / app / images / users / 10 / flyer. PNG»

мой вопрос в том, как я могу получить доступ к пути к изображению? Я хочу показать сохраненное изображение с помощью img src = "">. Я понятия не имею, что положить внутри «src = …»

Related of "Доступ к изображениям Laravel за пределами общедоступной папки"

Имея дело с загрузкой файлов пользователей в веб-приложениях, основным аспектом является безопасность контента пользователя. Следует использовать безопасный способ загрузки личных файлов пользователя в веб-приложения.

Как и в вашем случае, вы хотите получить доступ к изображению пользователя за пределами общедоступной папки. Это можно сделать самым безопасным способом, как показано ниже.

Прежде всего создайте каталог прямо в корневом каталоге Laravel (где находится общая папка), пусть имя каталога будет uploads . Используйте этот каталог для загрузки личных файлов пользователей.

В случае изображений создайте другой каталог внутри загрузок в качестве каталога uploads uploads/images/ inside uploads, чтобы вы могли иметь разные места хранения для файлов разных типов.

Не забудьте загрузить изображение в каталог изображений с другим именем и без их расширений, чтобы он выглядел как файл без расширения. Сохраните имя файла и его расширение в базе данных, которые могут быть использованы позже, чтобы сохранить местоположение изображения.

Теперь вам нужно создать отдельный маршрут, чтобы показать изображение пользователя.

 Route::get('users/{id}/profile_photo', 'PhotosController@showProfilePhoto')->name('users.showProfilePhoto'); 

PhotosController.php

 class PhotosController extends Controller { private $image_cache_expires = "Sat, 01 Jan 2050 00:00:00 GMT"; public function showProfilePhoto($id) { $user = User::find($id); $path = base_path() . '/uploads/images/'; if($user && $user->photo) // Column where user's photo name is stored in DB { $photo_path = $path . $user->photo; // eg: "file_name" $photo_mime_type = $user->photo_mime_type; // eg: "image/jpeg" $response = response()->make(File::get($photo_path)); $response->header("Content-Type", $photo_mime_type); $response->header("Expires", $this->image_cache_expires); return $response; } abort("404"); } } 

Метод, описанный выше в PhotController – showProfilePhoto($user_id) будет запущен сразу же после доступа к маршруту с именем – users.showProfilePhoto .

Ваш HTML-код будет выглядеть следующим образом.

 <img src="<?php echo route('users.showProfilePhoto', array('id' => $user->id)); ?>" alt="Alter Text Here"> 

Вышеприведенный код будет работать как шарм, и изображение будет показано пользователю без объявления / публикации правильного пути изображения для публики. По моему мнению, это безопасный способ борьбы с загрузкой файлов в веб-приложениях.

Вы можете сделать это следующим образом:

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

Справка:

Laravel 5 – Как получить доступ к изображению, загруженному в хранилище в представлении?

Или вы можете использовать эту библиотеку: https://github.com/thephpleague/glide

Просто используйте композитор, чтобы установить его в свой проект.

По умолчанию это отображает изображения из вашего хранилища и позволяет вам делать с ним всевозможные вещи, такие как обрезка, цветокоррекция и т. Д.

Справка:

http://glide.thephpleague.com/

https://laracasts.com/discuss/channels/laravel/laravel-5-how-can-we-access-image-from-storage?page=1

У вас могут быть некоторые изображения, которые вы не хотите хранить в общедоступном каталоге по нескольким причинам.

Хотя сохранение ваших изображений имеет множество преимуществ.

Есть много способов добиться этого, однако у меня есть это простое решение.

Вы должны создать класс-помощник, если он уже не имеет

 <?php namespace App\Services; class Helper { public function imageToBase64($path) { $type = pathinfo($path, PATHINFO_EXTENSION); $data = file_get_contents($path); return 'data:image/' . $type . ';base64,' . base64_encode($data); } } 

Тогда на ваш взгляд (клинок)

 @inject('helper', 'App\Services\Helper') <img width="200" height="250" src="{{$helper->imageToBase64(storage_path('app/images/users/' . Auth::user()->id)}}">