Мне нужно хранить изображения в бэкэнд для зарегистрированных пользователей. Сохраненные изображения должны быть защищены и не видны снаружи (общедоступны). Для этого я выбрал папку «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 = …»
Имея дело с загрузкой файлов пользователей в веб-приложениях, основным аспектом является безопасность контента пользователя. Следует использовать безопасный способ загрузки личных файлов пользователя в веб-приложения.
Как и в вашем случае, вы хотите получить доступ к изображению пользователя за пределами общедоступной папки. Это можно сделать самым безопасным способом, как показано ниже.
Прежде всего создайте каталог прямо в корневом каталоге 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)}}">