Nano Hash - криптовалюты, майнинг, программирование

Как ограничить максимальную загрузку 1 файла в jQuery-File-Upload из бэкэнда в PHP

Я использую jQuery-File-Upload и пытаюсь ограничить максимальное количество загружаемых изображений до 1 (загрузка одного изображения).

Я использую пример файла php из самой демо-версии, который находится в server/php/ как UploadHandler.php

На данный момент я заблокировал загрузку нескольких изображений при перетаскивании в JS, но, поскольку он находится только на стороне клиента и которому нельзя доверять в качестве решения с полным доказательством, я хочу знать, как я могу ограничить максимальное количество нет. загрузок на запрос

До сих пор я сделал:

<input class="photo file" id="fileupload" name="images" type="file">

И со стороны JS:

$('#fileupload').fileupload({
    url: url,
    dataType: 'json',
    autoUpload: true,
    dropZone: $('#fileupload'),
    singleFileUploads: false,
}).on('fileuploadadd', function (e, data) {
    //Hides error
    $('.error').hide().children().text('');
    var maxFileUploadAllowed = 1;
    var fileCount = data.files.length;
    if (fileCount > maxFileUploadAllowed) {
      $('.error').fadeIn().children().text("You are allowed to upload only 1 file");
      return false;
    }

и это работает правильно, но также необходимо ограничить 1 файл на бэкэнде

При некотором копании я обнаружил, что в options есть параметр как 'max_number_of_files' => null,, я попытался изменить его на 1, но затем при каждой загрузке файла, даже при загрузке одного файла, он начал выдавать ошибку как Maximum File limit exceeded

И после дальнейших раскопок я обнаружил, что проверки в этом утверждении if каким-то образом верны и вызывают ошибку.

if (is_int($this->options['max_number_of_files']) &&
            ($this->count_file_objects() >= $this->options['max_number_of_files']) &&
            // Ignore additional chunks of existing files:
            !is_file($this->get_upload_path($file->name))) {
        $file->error = $this->get_error_message('max_number_of_files');
        return false;
    }

Я сделал echo $this->count_file_objects() и обнаружил, что на самом деле он возвращает максимальное количество файлов, разрешенных в каталоге загрузки.

Таким образом, в демонстрационном коде нет обработчика, который мог бы ограничить число. загрузок файлов на сервер.

Просто хотел узнать, есть ли способ ограничить нет. загрузок файлов в бэкэнд?

Будут проблемы, когда пользователь будет возиться со следующим:

  1. Массив имен <input class="photo file" id="fileupload" name="images[]" type="file">
  2. "множественный" атрибут в <input class="photo file" id="fileupload" name="images[]" type="file" multiple>
  3. Или возиться со следующим фрагментом

код ниже:

var maxFileUploadAllowed = 1;
    var fileCount = data.files.length;
    if (fileCount > maxFileUploadAllowed) {
      $('.error').fadeIn().children().text("You are allowed to upload only 1 file");
      return false;
    }

Так как в бэкенде нет проверки.


Ответы:


1

После более глубокого изучения PHP-кода в демоверсии server/php/UploadHandler.php

Я обнаружил, что процесс загрузки работает на POST, поэтому для обработки загрузок вызывается метод $this->post($this->options['print_response']);:

И перед этим процессом были некоторые начальные проверки в validate():

protected function validate($uploaded_file, $file, $error, $index) {
    if ($error) {
        $file->error = $this->get_error_message($error);
        return false;
    }
    $content_length = $this->fix_integer_overflow(
        (int)$this->get_server_var('CONTENT_LENGTH')
    );
    $post_max_size = $this->get_config_bytes(ini_get('post_max_size'));
    if ($post_max_size && ($content_length > $post_max_size)) {
        $file->error = $this->get_error_message('post_max_size');
        return false;
    }
...
return true;
}

Итак, ясно, что validate() отвечает за первоначальные проверки.

Изначально в Параметры я добавил параметр под названием max_files_upload_allowed: 1 а потом добавил сообщение об ошибке в $error_messages как 'max_files_upload_allowed' => 'You are not allowed to upload multiple files at once'

затем я создал свой метод getUploadFilesCount(), чтобы проверить нет. файлов, добавленных пользователем в очередь загрузки:

protected function getUploadFilesCount() {
      $file_upload_count = $this->get_upload_data($this->options['param_name']);
      return count($file_upload_count['name']);
    }

И после этого добавил следующую проверку в validate()

//Check max_files_upload_allowed here
if (is_int($this->options['max_files_upload_allowed']) && (
        $this->getUploadFilesCount() > $this->options['max_files_upload_allowed'] &&
        $this->options['max_files_upload_allowed'] > 0)
    ) {
            $file->error = $this->get_error_message('max_files_upload_allowed');
    return false;
}

И вуаля! Если пользователь добавит больше файлов, чем указано в max_files_upload_allowed: 1, то он(а) получит сообщение об ошибке.

И это решает задачу, предотвращает злонамеренные попытки и повышает надежность используемого процесса загрузки файлов.

06.11.2016
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..