如何在Laravel 5中保护图像不被公开查看?
在Laravel 5中如何保护图片不被公众查看?
在之前的项目中,我通过以下方式来保护上传的文件:
创建存储磁盘:
config/filesystems.php 'myDisk' => [ 'driver' => 'local', 'root' => storage_path('app/uploads'), 'url' => env('APP_URL') . '/storage', 'visibility' => 'private', ],
这将把文件上传到\storage\app\uploads\
中,这个路径对公众不可见。
在控制器中保存文件:
Storage::disk('myDisk')->put('/任意文件夹名称/' . $file, $data);
为了让用户查看文件并保护上传文件不受未经授权的访问,首先检查文件是否存在于磁盘上:
public function returnFile($file) { //该方法将查找文件并从磁盘获取它 $path = storage_path('app/uploads/任意文件夹名称/' . $file); try { $file = File::get($path); $type = File::mimeType($path); $response = Response::make($file, 200); $response->header("Content-Type", $type); return $response; } catch (FileNotFoundException $exception) { abort(404); } }
如果用户有正确的访问权限,则提供该文件:
public function licenceFileShow($file) { /** *确保 $file 有一个点 *然后检查用户是否具有管理员角色。如果为真,则提供,否则 */ if (strpos($file, '.') !== false) { if (Auth::user()->hasAnyRole(['Admin'])) { /** 为管理员提供文件*/ return $this->returnFile($file); } else { /**检查请求是否来自文件所有者的逻辑**/ return $this->returnFile($file); } } else { //给出无效的文件名 return redirect()->route('home'); } }
最后在Web.php路由中设置:
Route::get('uploads/user-files/{filename}', 'MiscController');
在Laravel 5.x中,可以保护图像不被公开查看。首先,在Laravel中的storage文件夹下创建一个名为images的文件夹(选择storage文件夹是因为它已经具有写权限,可以在将图像上传到其中时使用),即storage/app/images。然后,将要保护的图像从公共文件夹移动到新创建的images文件夹。接下来,需要创建一个路由和图像控制器。
创建路由:
Route::get('images/users/{user_id}/{slug}', [ 'as' => 'images.show', 'uses' => 'ImagesController', 'middleware' => 'auth', ]);
该路由将将所有图像请求访问转发到身份验证页面,如果用户未登录。
创建图像控制器:
class ImagesController extends Controller { public function show($user_id, $slug){ $storagePath = storage_path('app/images/users/' . $user_id . '/' . $slug); return Image::make($storagePath)->response(); } }
对于使用Laravel 5.2及更高版本的用户,可以使用新的更好的文件响应方式。可以使用file方法直接在用户的浏览器中显示文件而不是下载。这种方式不会像之前的方式那样重新生成文件。示例如下:
return response()->file($pathToFile); return response()->file($pathToFile, $headers);
可以根据自己的需求修改存储路径和文件/文件夹结构。还可以在控制器中添加条件,仅为特定成员显示图像。还可以对文件名进行哈希处理,使用文件名、时间戳和其他变量。
此方法也可以用作替代公共文件夹上传的方法,但不推荐这样做。如果要在存储路径中上传图像而不需要保护它们,只需按照相同的过程操作,但移除'middleware' => 'auth'。这样可以避免在公共文件夹中设置777权限,同时保持安全的上传环境。
总之,通过以上方法可以保护Laravel中的图像不被公开查看,并提供了不同的解决方案和注意事项。