Проверка загрузки файла Laravel не запускается – TokenMismatchException

Я могу загрузить файлы, если они соответствуют этому правилу проверки

'user_file' => 'file|max:10240|mimes:xls,xlsx,doc,docx,pdf,zip'

все идет нормально.

Я установил свой upload_max_filesize на 32 МБ и post_max_size на 40 МБ в php.ini.

но если я попытаюсь загрузить файл размером более 40 МБ, мои правила проверки даже не сработают. Я получаю ошибку TokenMismatchException....

Если кто-то может проверить это, просто попытавшись загрузить какой-нибудь очень большой файл (например, видеофайл)


person lewis4u    schedule 10.11.2016    source источник


Ответы (3)


Когда вы превышаете размер полезной нагрузки поста - все сбрасывается, поэтому csrf_token не приходит в laravel и файл загрузки пустой, поэтому его нельзя проверить.

ОБНОВИТЬ

Чтобы исправить это, вам нужно проверить размер файла перед загрузкой с помощью javascript или jquery.

вот пример:

Как проверить размер входного файла с помощью jQuery?

person Giedrius Kiršys    schedule 10.11.2016
comment
но как я могу оставить отзыв пользователю? tokenmissmatch - это сумасшествие... или мне следует увеличить размер загружаемого файла - person lewis4u; 10.11.2016
comment
я нашел это сейчас laravel.io /forum/ и вы были правы насчет размера полезной нагрузки сообщения - person lewis4u; 10.11.2016
comment
@ lewis4u Вы просто не можете. Вы должны проверить размер файла с помощью javascript. Или вы можете отключить проверку csrf для этого конкретного маршрута, а затем проверить, не передаются ли данные из запроса. - person Giedrius Kiršys; 10.11.2016
comment
я думаю, что могу исправить это, проверив размер файла в контроллере - person lewis4u; 10.11.2016
comment
@ lewis4u Если вы достигнете предела PHP post_max, вы не получите данных на контроллер, поэтому вам нечего проверять :) - person Giedrius Kiršys; 10.11.2016
comment
да, вы были правы... так что мне нужно проверить размер файла, прежде чем пользователь нажмет кнопку отправки... иначе я получу tokenmissmatch, если файл слишком большой - person lewis4u; 10.11.2016

В случае загрузки файлов файл необходимо скопировать во временное место на сервер, после чего правила будут работать. поэтому ваш сервер не будет разрешать файлы размером более 40 МБ (post_max_size) во временную папку, поэтому правила не будут работать. Вместо этого, чтобы исправить это, вам нужно выполнить проверку внешнего интерфейса для файлов.

Вы можете сделать это, используя простой Javascript, как показано ниже,

$('input[type="file"]').change(function () {
if (this.files[0] != undefined) {
    var name = this.name;
    var filesize = this.files[0].size;
    var field = $('#' + this.name).parents('.input-group');

    //check if file size is larger than 3MB(which is 3e+6 bytes)
    if (filesize > 3000000) {
       alert(filesize);
    //reset that input field if its file size is more than 3MB
       $('[name="' + name + '"]').val('')
    }
  }
});

вы можете просто включить это для всех входных данных type='file', изменив ограничение размера в байтах.

person Shivakrishna    schedule 28.11.2016

Я столкнулся с той же проблемой. Вы также должны убедиться, что валидатор проверяет file данные, а не post данные:

Я тестировал:

$validator = Validator::make($request->post(), [
    myfield' => 'required|image|mimes:jpeg,png,jpg,gif|max:1000000'
]);

Должны были быть :

$validator = Validator::make($request->file(), [
    myfield' => 'required|image|mimes:jpeg,png,jpg,gif|max:1000000'
]);
person secavfr    schedule 20.03.2019