Как проверить загрузку файлов в Laravel

Я закончил учебник для загрузки файлов изображений. Как я могу проверить загрузку файлов в представлении, когда пользователь загружает файл размером более 2 МБ?

create.blade.php

@if (count($errors) > 0)
    <div class="alert alert-danger">
        <strong>Whoops!</strong> Errors.<br><br>
        <ul>
            @foreach ($errors->all() as $error)
                <li>{{ $error }}</li>
            @endforeach
        </ul>
    </div>
@endif
@if(session('success'))
    <div class="alert alert-success">
        {{ session('success') }}
    </div>
@endif
<div class="form-group">
    <input type="file" name="photos[]" multiple aria-describedby="fileHelp"/>
    <small id="fileHelp" class="form-text text-muted">jpeg, png, bmp - 2MB.</small>
</div>

правила

public function rules()
{
    $rules = [
        'header' => 'required|max:255',
        'description' => 'required',
        'date' => 'required',
    ];
    $photos = $this->input('photos');
    foreach (range(0, $photos) as $index) {
        $rules['photos.' . $index] = 'image|mimes:jpeg,bmp,png|max:2000';
    }

    return $rules;
}

Все в порядке, однако, когда я пытаюсь загрузить файл размером более 2 МБ, выдает ошибку:

Осветить \ Http \ Exceptions \ PostTooLargeException Нет сообщения

Как я могу решить эту проблему и обеспечить это исключение?

4 ответа

Решение

В laravel вы не можете обработать этот случай в контроллере, так как он не попадет в controller/customrequest и будет обработан в промежуточном программном обеспечении, так что вы можете обработать это в файле ValidatePostSize.php:

public function handle($request, Closure $next)
 {
  //       if ($request->server('CONTENT_LENGTH') > $this->getPostMaxSize()) 
            {
             //            throw new PostTooLargeException;
  //        }

   return $next($request);
 }



/**
 * Determine the server 'post_max_size' as bytes.
 *
 * @return int
 */
protected function getPostMaxSize()
{
    if (is_numeric($postMaxSize = ini_get('post_max_size'))) {
        return (int) $postMaxSize;
    }

    $metric = strtoupper(substr($postMaxSize, -1));

    switch ($metric) {
        case 'K':
            return (int) $postMaxSize * 1024;
        case 'M':
            return (int) $postMaxSize * 1048576;
        default:
            return (int) $postMaxSize;
    }
}

с вашим собственным сообщением

Или в App\Exceptions\Handler:

   public function render($request, Exception $exception)
   {
      if ($exception instanceof \Illuminate\Http\Exceptions\PostTooLargeException) {
        // handle response accordingly
      }
      return parent::render($request, $exception);
   }

Еще нужно обновить php.ini

upload_max_filesize = 10MB

Если вы не работаете с любым из вышеперечисленных решений, вы можете использовать проверку на стороне клиента, например, если вы используете jQuery, например:

$(document).on("change", "#elementId", function(e) {
 if(this.files[0].size > 7244183)  //set required file size 2048 ( 2MB )
  { 
     alert("The file size is too larage");
    $('#elemendId').value = ""; 
  }
});

или же

<script type="text/javascript"> 
 function ValidateSize(file) { 
   var FileSize = file.files[0].size / 1024 / 1024; // in MB 
   if (FileSize > 2) { 
     alert('File size exceeds 2 MB'); 
      $(file).val(''); //for clearing with Jquery 
   } else { 

   } 
 } 
</script>

У вас есть проверка изображения в $rules. попробуйте этот код:

$this->validate($request,[
                'header' => 'required|max:255',
                'description' => 'required',
                'date' => 'required',
                'photos.*' => 'image|mimes:jpeg,bmp,png|max:2000',
    ]);

Вы можете попробовать поместить собственное сообщение внутри message() сообщение или добавить PostTooLargeException обработчик в Handler учебный класс. Что-то вроде того:

public function render($request, Exception $exception)
{
...
    if($exception instanceof PostTooLargeException){
                return redirect()->back()->withErrors("Size of attached file should be less ".ini_get("upload_max_filesize")."B", 'addNote');
        }
...
}

Laravel использует свое промежуточное программное обеспечение ValidatePostSize для проверки post_max_size запроса, а затем выдает исключение PostTooLargeException, если CONTENT_LENGTH запроса слишком велико. Это означает, что исключение, если его выкинуть еще до того, как оно попадет на ваш контроллер.

Что вы можете сделать, это использовать метод render() в вашем App\Exceptions\Handler, например

public function render($request, Exception $exception){
   if ($exception instanceof PostTooLargeException) {
      return response('File too large!', 422);
   }

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

Обратите внимание, что вы должны вернуть ответ от этого метода, вы не можете просто вернуть строку, как вы можете из метода контроллера.

Приведенный выше ответ должен повторить возвращаемый файл "Файл слишком большой!"; Вы имеете в примере в своем вопросе, вы можете изменить это, чтобы быть чем-то другим.

Надеюсь это поможет!

Другие вопросы по тегам