2014-01-07 16 views
5

Mein Ziel ist es, die Max Upload-Datei Ausnahme zu verwalten, und zeigen Sie eine clientseitige freundliche Nachricht, aber ich weiß nicht, wo ist der beste Ort, um dies zu steuern. Das ist meine Controller-Methode:Handle Laravel 4 Hochladen große Datei Ausnahme

public function upload_file() 
    { 
     if (!Input::hasFile('file')) 
      return; 

     $utils = App::make('utils'); 
     $file = Input::file('file'); 

     $name = Input::get('name'); 
     $size = $file->getSize(); 

     if ($size > FileModel::$max_file_size) 
      return json_encode(array('success'=>false, 'message'=>sprintf('The file size should be lower than %smb.',FileModel::$max_file_size/1000000))); 

     $original_file_name = $file->getClientOriginalName(); 

     $destination_directory = ""; 

     $final_file_name = $utils->copy_file_to_location($file); 

     return json_encode(array('success'=>true, 'file'=>$original_file_name)); 
    } 

Und das ist die utils copy_file_to_location Methode:

public function copy_file_to_location($file, $destination_directory = "") 
    { 
     if (!isset($file)) 
      return; 
     $file_name = time()."_".$file->getClientOriginalName(); 

     $file->move(app_path().'/storage/files/'.$destination_directory, $file_name); 
     return $file_name; 
    } 

ich knwo nicht, wo die Ausnahme zu behandeln, die ausgelöst wird, wenn das Hochladen von Dateien, die eine Reibe Größe haben als Die maximale Upload-Dateigröße des Servers. Wo und wie soll ich damit umgehen, um eine benutzerfreundliche Nachricht anzuzeigen und die Benutzeroberfläche nicht zu sperren? Nebenbei verwende ich ExtJs 4 auf der Client-Seite. Vielen Dank.


EDIT


fand ich einen ähnlichen question, die viel hilft (es ist das gleiche Problem), aber ich muss wissen, wo innerhalb Laravel, sollte ich dies überprüfen.

Antwort

9

Es gibt zwei Fälle: Die Dateigröße ist größer als die PHP-Variable upload_max_filesize und die zweite ist, wenn sie größer als post_max_size Variable ist. Im ersten Fall wird eine Ausnahme ausgelöst, so dass sie leicht erfasst werden kann. Im zweiten Fall gibt es keine Ausnahme und ich habe this Frage für die Lösung verwendet.

Jetzt, wo Sie diesen Code überprüfen: im Laravel Controller aciton Methode. Ich dachte, dass Code in der Handlung des Controllers nie ausgeführt wurde, aber ich lag falsch. So endlich ist dies ein Weg, um dies zu lösen:

public function upload_file() 
    { 
     $file_max = ini_get('upload_max_filesize'); 
     $file_max_str_leng = strlen($file_max); 
     $file_max_meassure_unit = substr($file_max,$file_max_str_leng - 1,1); 
     $file_max_meassure_unit = $file_max_meassure_unit == 'K' ? 'kb' : ($file_max_meassure_unit == 'M' ? 'mb' : ($file_max_meassure_unit == 'G' ? 'gb' : 'unidades')); 
     $file_max = substr($file_max,0,$file_max_str_leng - 1); 
     $file_max = intval($file_max); 

     //handle second case 
     if((empty($_FILES) && empty($_POST) && isset($_SERVER['REQUEST_METHOD']) && strtolower($_SERVER['REQUEST_METHOD']) == 'post')) 
     { //catch file overload error... 
      //grab the size limits... 
      return json_encode(array('success'=>false, 'message'=>sprintf('The file size should be lower than %s%s.',$file_max,$file_max_meassure_unit))); 
     } 

     try{ 

      if (!Input::hasFile('file')) 
       return; 

      $utils = App::make('utils'); 
      $file = Input::file('file'); 

      $name = Input::get('name'); 
      $size = $file->getSize(); 

      if ($size > $file_max) 
       return json_encode(array('success'=>false, 'message'=>sprintf('El tamaño del archivo debe ser menor que %smb.',$file_max))); 

      $original_file_name = $file->getClientOriginalName(); 

      $destination_directory = ""; 

      $final_file_name = $utils->copy_file_to_location($file);  

      return json_encode(array('success'=>true, 'file'=>$original_file_name)); 
     } 
     catch (Exception $e) 
     { 
      //handle first case 
      return json_encode(array('success'=>false, 'message'=>sprintf('The file size should be lower than %s%s.',$file_max,$file_max_meassure_unit))); 
     } 
    } 
1

Die Einstellungen "upload_max_filesize" und "post_max_size", die Sie in der entsprechenden Frage sehen, werden nicht von Laravel verarbeitet. Sie sind Teil der Konfigurationsdatei php.ini, die sich in Ihrer PHP-Installation befindet.

1

Alte Post, aber immer noch ein relevantes Problem. Verwendung der \ Illuminate \ Foundation \ Http \ Middleware \ VerifyPostSize Middleware und behandeln den Fehler innerhalb der handler.php render() Methode die doc-Middleware überprüfen https://laravel.com/docs/5.5/middleware#registering-middleware

Das Innere handler.php meine Methode ist:

public function render($request, \Exception $exception) 
     { 
     //thats the json your client will recieve as a response, can be anything you need 
      $response = [ 
       'code' => 500, 
       'status' => 'error', 
       'message' => 'Internal server error.', 
       'exception' => get_class($exception), 
       'exception_message' => $exception->getMessage(), 
       'url' => $request->decodedPath(), 
       'method' => $request->method(), 
      ]; 

      if (env('APP_ENV') === 'local') { 
       $response['trace'] = $exception->getTrace(); 
      } 

      if ($exception instanceof PostTooLargeException) { 
       $response['code'] = 413; //Payload too large 
       $response['message'] = $response['message'] .' The maximum request size is: ' .ini_get('post_max_size'); 
      } 

      return response()->json($response, $response['code']); 
     }