2016-05-16 57 views
9

我有public/Asset/Media /文件夾通過驗證控制器安全資產/媒體文件夾? Laravel 5.2

我可以像下面那樣公開訪問這個文件。

http://localhost/myapp/public/Asset/Media/1/phpunit.xml 

同樣地,資產/媒體文件夾中還有其他文件夾正在動態創建。

有許多文件也存在於這些子文件夾中,也存在於資產/ Media文件夾

有什麼辦法,例如,如果我嘗試訪問的資產/ Media文件夾的任何文件或文件存在在資產/媒體文件夾的子文件夾中,我應該重定向到登錄頁面,因爲身份驗證沒有完成?

我的意思是,我可以用Auth中間件來保護這個文件夾嗎?如果是這樣,如果我們必須從Android應用程序訪問文件,這是一種有效的方法嗎?

回答

1

我的樣本網址是在這裏:

http://domainname.com/storage/Asset/Media/1/filename.txt

我的路線

Route::get('/storage/Asset/Media/{ID}/{file}', array(
    'as' => 'Files', 
    'uses' => 'User\Account\Media\[email protected]', 
)); 

控制器的操作方法

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下載任何文件類型。

1

如果你想保護文件,他們需要通過Laravel。像你一樣訪問文件(使用完整路徑)不通過Laravel。您可以通過創建一個途徑實現這一目標:

Route::group(['middleware' => ['auth']], function() { 
    Route::get('/secure/file/{file_name}', '[email protected]'); 
} 

然後,創建一個控制器來訪問該文件,這樣就可以使用驗證來檢查權限訪問。這也意味着,你應該將文件放在難以接近的位置,並使用Laravel文件系統使用PHP訪問該文件:

class FileController extends Controller { 
    public function file() 
    { 
     return Storage::get('path/to/phpunit.xml'); 
    } 
} 
+0

如果我們必須從Android應用程序訪問文件,它是否有效? – Pankaj

+0

我沒有看到它通過Android應用程序訪問文件的問題,但如果您使用此方法提供大量/大量文件,則此方法可能會消耗比預期更多的資源。 –

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', '.+'); 
+0

如果我們必須從Android應用程序訪問文件,它是否有效? – Pankaj

+0

這根本不起作用。我仍然能夠將該文件視爲匿名用戶 – Pankaj

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}', '[email protected]')->where('filename', '^[^/]+$'); 

就是這樣,現在只有你的身份驗證的用戶將能夠下載資源文件感謝名單到中間件身份驗證,這也將適用於Android應用程序。