查看经过身份验证的用户的存储文件夹中的文件
View files inside storage folder for authenticated User
我正在使用 spatie 库上传一些文件,这些文件将保存到存储文件夹中。我现在想要完成的是当我是经过身份验证的用户时查看这些文件或图像。我试过使用这个命令创建一个 symlink,
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
当我点击 link 时,它会给我这样的东西。
http://127.0.0.1:8000/complaints.viewfile/http%3A%2F%2F127.0.0.1%3A8000%2Fstorage%2F3%2F60580fdeadc55_worship.jpg
请帮忙。谢谢...
如果我错了请纠正我,但这不是通过系统设置来纠正的最简单方法吗?就像你有不同的用户,你只是把他们放在不同的组中,这些组对 folders/files.
具有不同的权限
您需要了解 Web 服务器如何提供文件以及它如何与 laravel 应用程序交互。
您可能已将 nginx 或 apache 设置为提供 laravel 应用的 public 文件夹中的文件。即:/var/www/sites/laravel-site/public
.
当 HTTP 请求发送到您的服务器时,如果您的 nginx 或 apache 配置为静态提供 laravel-site.com/storage/documents/secrets.pdf
等文件,那么您的 laravel 应用程序代码将永远不会是 运行,并且您无法在应用程序级别控制对这些文件的访问。
如果你想设置对文件的访问控制,你需要首先确保请求不会被静态处理,然后在检查 user/request 是否有之后设置一个路由来处理文件访问您要提供的文件的权限。
关于如何做到这一点,还有很多其他很棒的 and resources。
我正在使用 spatie 库上传一些文件,这些文件将保存到存储文件夹中。我现在想要完成的是当我是经过身份验证的用户时查看这些文件或图像。我试过使用这个命令创建一个 symlink,
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
当我点击 link 时,它会给我这样的东西。
http://127.0.0.1:8000/complaints.viewfile/http%3A%2F%2F127.0.0.1%3A8000%2Fstorage%2F3%2F60580fdeadc55_worship.jpg
请帮忙。谢谢...
如果我错了请纠正我,但这不是通过系统设置来纠正的最简单方法吗?就像你有不同的用户,你只是把他们放在不同的组中,这些组对 folders/files.
具有不同的权限您需要了解 Web 服务器如何提供文件以及它如何与 laravel 应用程序交互。
您可能已将 nginx 或 apache 设置为提供 laravel 应用的 public 文件夹中的文件。即:/var/www/sites/laravel-site/public
.
当 HTTP 请求发送到您的服务器时,如果您的 nginx 或 apache 配置为静态提供 laravel-site.com/storage/documents/secrets.pdf
等文件,那么您的 laravel 应用程序代码将永远不会是 运行,并且您无法在应用程序级别控制对这些文件的访问。
如果你想设置对文件的访问控制,你需要首先确保请求不会被静态处理,然后在检查 user/request 是否有之后设置一个路由来处理文件访问您要提供的文件的权限。
关于如何做到这一点,还有很多其他很棒的