Laravel просмотр изображения на локальном диске

#php #laravel

Вопрос:

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

Функция Загрузки

 public function updatedUpload($upload){
$object = $this->currentTeam->objects()->make(['parent_id' => $this->object->id]);
$object->objectable()->associate(
    $this->currentTeam->files()->create([
        'name' => $upload->getClientOriginalName(),
        'size' => $upload->getSize(),
        'path' => $upload->storePublicly('files', ['disk' => 'local'])
    ])
);

$object->save();
$this->object = $this->object->fresh();
 

}

Но я хочу положить его в домашнее лезвие.

Как мне это сделать, и только тот, кто загрузил его, может получить к нему доступ?

Ответ №1:

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

Например, в вашем routes/web.php

 Route::get('/private_resource',[AppHttpControllersPrivateResource::class, 'getLocalResource'])
->name('get_private_resource')->middleware('auth');
 

Определить PrivateResource контроллер

 class PrivateResource
{
    public function getLocalResource($filename){
        // Get your resource, for example
        $file = File::where('name', $filename)->first();

        // Check whether user can access this resource
        // For example
        if(Auth::id() != $file->user_id) abort(403);

        return Storage::disk('local')->download($filename);
    }
}
 

Дополнительно: Если вам нужна дополнительная конфиденциальность, вы можете использовать подписанный маршрут, используя функцию ниже.

 URL::signedRoute('get_private_resource');
 

И добавьте signed промежуточное программное обеспечение в свой маршрут

 Route::get('/private_resource',[AppHttpControllersPrivateResource::class, 'getLocalResource'])
->name('get_private_resource')->middleware('auth','signed');
 

Комментарии:

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

2. Таким образом, вы можете получить его содержимое, используя Storage::disk('local')->get($filename);

3. Дело в том, что в моей базе данных путь к файлу-files/QvzsEzIMaX0LdESDZ0BSiW9aPM35Vz5s3dq4T0yU.png, если я вставлю это в ex: my-site.com/storage/files/… я не могу получить к нему доступ, я получаю 404

4. Это нормально, так как вы пытаетесь защитить свой файл от публичного доступа, поэтому вы не должны обращаться к нему подобным образом. Вы должны получить его содержимое с маршрута, в котором есть некоторые промежуточные программы.