2017-03-19 40 views
0

要重現錯誤,只需將文件上傳到Laravel中超過配置中的post_max_size的任何POST路由。如何在Laravel中捕獲PostTooLargeException?

我的目標是簡單地捕捉錯誤,以便通知用戶他上傳的文件太大。說:

public function postUploadAvatar(Request $request) 
    try { 
    // Do something with $request->get('avatar') 
    // Maybe validate file, store, whatever. 
    } catch (PostTooLargeException $e) { 
    return 'File too large!'; 
    } 
} 

上述代碼是在標準的Laravel 5(PSR-7)。問題在於,一旦注入的請求發生錯誤,函數就無法執行。因此無法捕捉到它的功能。那麼如何抓住它呢?

回答

5

Laravel使用它的ValidatePostSize中間件檢查請求的post_max_size,然後在請求的CONTENT_LENGTH太大時拋出PostTooLargeException。這意味着如果拋出異常,甚至在它到達控制器之前。

您可以做的是在您的App\Exceptions\Handler中使用render()方法,例如,

public function render($request, Exception $exception) 
{ 
    if ($exception instanceof PostTooLargeException) { 

     return response('File too large!', 422); 
    } 

    return parent::render($request, $exception); 
} 

請注意,您必須返回此方法的響應,你不能只從一個控制器方法返回一個字符串狀即可。

上面的回答是複製return 'File too large!';你在問題的例子中,你可以明顯地改變這是別的。

希望這會有所幫助!

+0

感謝您的支持!看起來對我來說是一個好的開始。現在看看它。我會用這個更新我的發現。 – doncadavona

+0

這會捕獲錯誤,允許我以某種方式處理它。但是隨着返回響應,PHP也迴應消息「警告:POST內容 - 18156282字節的字節長度超過了在第0行未知的8388608字節的限制」。現在我該怎麼處理? – doncadavona

+0

@doncadavona您使用的是什麼版本或PHP,您使用的是哪個版本的Laravel,以及您的應用程序環境設置爲? –

0

如果您希望爲用戶添加更豐富的內容,您也可以重定向到您選擇的Laravel視圖。

public function render($request, Exception $exception) 
{ 
    if ($exception instanceof \Illuminate\Http\Exceptions\PostTooLargeException) 
     return response()->view('errors.post-too-large'); 

    return parent::render($request, $exception); 
} 

另請注意: 該異常被抓住,你應該確保您無論使用use Illuminate\Http\Exceptions\PostTooLargeException; import語句導入類或只是寫類似的完整路徑提供給PostTooLargeException正確的路徑我例。

相關問題