使用Laravel路由访问存储子文件夹

时间:2017-08-08 20:27:44

标签: php laravel routes

我从这个post中获得了灵感,可以安全地访问我的存储空间中的文件。

帖子建议使用以下路线:

Route::get('file/{filename}', 'FileController@getFile')->where('filename', '^[^/]+$');

所以我可以访问任何文件,例如http://yoursite.com/file/secret.jpg

问题如果{filename}包含subfolder + filename该怎么办? 网址看起来像http://yoursite.com/file/personal/secret.jpg。 这条路线无法找到。

我也可能有很多级别的子文件夹。

可能的解决方案 作为临时解决方案,我将http://yoursite.com/file/personal/secret.jpg替换为http://yoursite.com/file/personal|secret.jpg,因此{filename}将等于personal|secret.jpg。在getFile方法中,我会将|替换为/。但它看起来像一个丑陋的解决方案

对此有更好的解决方案吗?

2 个答案:

答案 0 :(得分:5)

您可以做的是为该路线参数定义模式。

在路线文件的顶部添加:

Route::pattern('filename', '[a-zA-Z0-9.\-_\/]+');

此外,您需要删除路由的where子句:

Route::get('file/{filename}', 'FileController@getFile');

希望这有帮助!

答案 1 :(得分:4)

即使你可以在where条件下尝试正则表达式。

像这样的东西。

Route::get('file/{filename}', function ($filename) {
    dd($filename);
})->where('filename', '^(.+)\/([^\/]+)$');

测试并使用file / filename.jpg或文件/ files / files / filename.jpg等。