Как отправить Ajax форму с файлом в Drupal 8/9?

Для отправки Ajax формы с файлом в Drupal 8/9 необходимо выполнить следующие шаги:

1. Создать форму:

public function buildForm(array $form, FormStateInterface $form_state) {
  $form['file'] = [
    '#type' => 'managed_file',
    '#title' => $this->t('Upload File'),
    '#upload_location' => 'public://',
    '#upload_validators' => [
      'file_validate_extensions' => ['jpg jpeg png gif'],
    ],
  ];

  $form['submit'] = [
    '#type' => 'submit',
    '#value' => $this->t('Submit'),
    '#ajax' => [
      'callback' => '::submitFormAjax',
    ],
  ];

  return $form;
}

2. Обработать отправку формы с использованием Ajax:

public function submitForm(array &$form, FormStateInterface $form_state) {
  // Обработка данных формы и загруженного файла
}

public function submitFormAjax(array &$form, FormStateInterface $form_state) {
  $response = new AjaxResponse();

  // Обработка данных формы и загруженного файла

  return $response;
}

3. Настроить маршрут для обработки формы:

mymodule.form_submit:
  path: '/my-form-submit'
  defaults:
    _form: 'DrupalmymoduleFormMyForm'
    _title: 'My Form Submit'
  requirements:
    _permission: 'access content'

4. На клиентской стороне использовать JavaScript для отправки данных формы с файлом через Ajax:

(function ($) {
  $('#my-form-id').submit(function (e) {
    e.preventDefault();

    var formData = new FormData($(this)[0]);

    $.ajax({
      url: '/my-form-submit',
      type: 'POST',
      data: formData,
      processData: false,
      contentType: false,
      success: function (data) {
        // Обработка успешного ответа
      },
      error: function () {
        // Обработка ошибки
      }
    });
  });
})(jQuery);

Следуя этим шагам, вы сможете успешно отправить Ajax форму с файлом в Drupal 8/9.