我有public / Asset / Media /文件夹
我可以像下面这样公开访问此文件。
http://localhost/myapp/public/Asset/Media/1/phpunit.xml
同样,Asset / Media文件夹中还有其他文件夹正在动态创建。
这些子文件夹中还有许多文件,并且也存在于资产/媒体文件夹
中有没有办法,如果我尝试访问Asset / Media文件夹中的任何文件或Asset / Media文件夹子文件夹中的任何文件,我应该被重定向到登录页面,因为没有进行身份验证? / p>
我的意思是,我可以使用Auth
中间件来保护此文件夹吗?如果是这样,如果我们必须从Android应用程序访问文件,这是一种有效的方法吗?
答案 0 :(得分:1)
如果您想保护文件,他们需要通过Laravel。像你一样访问文件(使用完整路径)不会通过Laravel。您可以通过创建路线来实现此目的:
Route::group(['middleware' => ['auth']], function () {
Route::get('/secure/file/{file_name}', 'FileController@file');
}
然后,创建一个Controller来访问该文件,以便您可以使用Auth检查访问权限。这也意味着您应该将文件放在一个无法访问的位置,并使用Laravel Filesystem来使用PHP访问该文件:
class FileController extends Controller {
public function file()
{
return Storage::get('path/to/phpunit.xml');
}
}
答案 1 :(得分:1)
Laravel 5.2引入了HTTP中间件,我建议你这样做。
https://laravel.com/docs/5.2/middleware#middleware-groups
这个帖子可能会帮助你让它发挥作用......
答案 2 :(得分:1)
使用以下路线:
Route::get('/myapp/public/Asset/Media/{id}', function ($id) {
if (Auth::guest()){
return Redirect::guest('login');
}else{
$img="/myapp/public/Asset/Media/".$id;
if(File::exists($img)) {
return Response::make($img, 200, array('content-type' => 'image/jpg'));
}else{
return false;
}
})->where('id', '.+');
答案 3 :(得分:1)
我的示例网址在这里:
<强> http://domainname.com/storage/Asset/Media/1/filename.txt 强>
我的路线
Route::get('/storage/Asset/Media/{ID}/{file}', array(
'as' => 'Files',
'uses' => 'User\Account\Media\MediaController@DownloadMedia',
));
控制器操作方法
public function DownloadMedia($ID) {
$headers = array(
'Content-Type' => 'application/octet-stream',
'Content-Disposition' => 'attachment; filename=somefile.txt"'
);
return response()->download(base_path("storage/Asset/Media/1/somefile.txt"));
}
重要的是我可以使用 application/octet-stream
下载任何文件类型。
答案 4 :(得分:0)
由于Laravel使用重写规则,所有人都可以访问公共文件夹中的文件,当有人访问公共文件夹中的文件时,Laravel甚至不会被调用。
所以,你必须把你的受限文件放在其他地方,也许放在存储文件夹中,但最终它并不重要。
将所有资产/媒体文件夹放入存储文件夹并更新动态创建文件夹的代码(How storage works)。
创建FileController:
<强> PHP 强>
class FileController extends Controller {
public function __construct() {
$this->middleware('auth');
}
public function downloadFile($filename) {
return response()->download(storage_path($filename), null, [], null);
}
}
配置此路线:
Route::get('file/{filename}', 'FileController@downloadFile')->where('filename', '^[^/]+$');
这就是它,现在只有经过身份验证的用户才能将资源文件下载到中间件身份验证,这也适用于Android应用程序。