我从这个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方法中,我会将|
替换为/
。但它看起来像一个丑陋的解决方案。
对此有更好的解决方案吗?
答案 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等。