Просмотр файлов в папке хранилища для аутентифицированного пользователя

Я использую библиотеку spatie для загрузки некоторых файлов, которые будут сохранены в папке хранилища. Чего я хочу добиться на данный момент, так это просмотреть эти файлы или изображения, когда я являюсь аутентифицированным пользователем. Я попытался создать символическую ссылку с помощью этой команды,

php artisan storage:link

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

МАРШРУТ :

Route::get('/storage/{filePath}', 'ComplaintsController@fileStorageServe')->where(['filePath' => '.*'])->name('complaints.viewfile');

КОНТРОЛЛЕР:

public function fileStorageServe($file) {
    // know you can have a mapping so you dont keep the sme names as in local (you can not precsise the same structor as the storage, you can do anything)

    // any permission handling or anything else

    // we check for the existing of the file 
    if (!Storage::disk('local')->exists($filePath)){ // note that disk()->exists() expect a relative path, from your disk root path. so in our example we pass directly the path (/.../laravelProject/storage/app) is the default one (referenced with the helper storage_path('app')
        abort('404'); // we redirect to 404 page if it doesn't exist
    } 
    //file exist let serve it 

    // if there is parameters [you can change the files, depending on them. ex serving different content to different regions, or to mobile and desktop ...etc] // repetitive things can be handled through helpers [make helpers]

    return response()->file(storage_path('app'.DIRECTORY_SEPARATOR.($filePath))); // the response()->file() will add the necessary headers in our place (no headers are needed to be provided for images (it's done automatically) expected hearder is of form => ['Content-Type' => 'image/png'];

    // big note here don't use Storage::url() // it's not working correctly.  
}

ПОСМОТРЕТЬ :

@foreach($complaint->attachments as $attachment)
  <a href="{{url('complaints.viewfile', $attachment->getUrl())}}" target="_blank">{{ $attachment->file_name }}</a>
@endforeach

Когда я нажимаю на ссылку, она дает мне что-то вроде этого.

http://127.0.0.1:8000/complaints.viewfile/http%3A%2F%2F127.0.0.1%3A8000%2Fstorage%2F3%2F60580fdeadc55_worship.jpg

Пожалуйста помоги. Спасибо...


person Hope    schedule 22.03.2021    source источник


Ответы (2)


Вам нужно понимать, как файлы обслуживаются веб-сервером и как это взаимодействует с приложением laravel.

Вероятно, вы настроили nginx или apache для обслуживания файлов из общей папки вашего приложения laravel. то есть: /var/www/sites/laravel-site/public.

Когда HTTP-запрос отправляется на ваш сервер, если ваш nginx или apache настроен на статическое обслуживание таких файлов, как laravel-site.com/storage/documents/secrets.pdf, тогда код вашего приложения laravel даже не будет запущен, и вы не сможете контролировать доступ к этим файлам на уровне приложения.

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

Есть много других замечательных ответов и ресурсы на как это сделать.

person Kurt Friars    schedule 22.03.2021
comment
Спасибо друг. Я попытался добавить предложенный вами ответ, но, похоже, я что-то упустил. Не могли бы вы дать свое представление об этом? - person Hope; 22.03.2021
comment
когда я использовал метод маршрута, он выдаст мне эту ошибку. Маршрут [complaints.viewfile] не определен. Почему это ? Я использовал его внутри своего тега привязки. - person Hope; 22.03.2021
comment
@Надеюсь, вы выходите за рамки вашего вопроса. Пожалуйста, задайте новый вопрос, если вы не можете решить свою проблему. Кроме того, пожалуйста, удалите отладочные комментарии выше :) - person Kurt Friars; 22.03.2021

Поправьте меня, если я ошибаюсь, но разве это не самый простой способ сделать это через системные настройки? Как будто у вас разные Пользователи и вы просто помещаете их в разные группы, которые имеют разные права на папки/файлы.

person HirnlosCoding    schedule 22.03.2021
comment
Да, но я хочу, чтобы это было видно с сайта. - person Hope; 22.03.2021
comment
О, ладно, тогда это другая история. Я посмотрю, может быть, я могу найти что-то о том, как это сделать. - person HirnlosCoding; 22.03.2021