#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. Это нормально, так как вы пытаетесь защитить свой файл от публичного доступа, поэтому вы не должны обращаться к нему подобным образом. Вы должны получить его содержимое с маршрута, в котором есть некоторые промежуточные программы.