diff --git a/media_bulk_upload.api.php b/media_bulk_upload.api.php
new file mode 100644
index 0000000000000000000000000000000000000000..689fd54050318cc4b9821843bef6fe559ec86d9d
--- /dev/null
+++ b/media_bulk_upload.api.php
@@ -0,0 +1,41 @@
+<?php
+
+/**
+ * @file
+ * Hooks provided by the Media Bulk Upload module.
+ */
+
+/**
+ * @addtogroup hooks
+ * @{
+ */
+
+/**
+ * Alter the results of a file_upload.
+ *
+ * Ensuring that the output of $file_ids is a list of file entities.
+ *
+ * @param array $file_ids
+ *   The file upload data. The value depends on the data structure of the
+ *   'file_upload' widget type. It's usually a list of file IDs.
+ * @param string $media_bulk_config_id
+ *   The Media Bulk Config entity ID.
+ * @param array $context
+ *   A collection of items which can be used to identify the context in which
+ *   a file upload is being done. The variable contains 4 keys:
+ *     - media_bulk_upload_form: the current MediaBulkUploadForm instance.
+ *     - form: the current form array.
+ *     - form_state: the current form state.
+ *     - media_bulk_config: the Media Bulk Config entity.
+ */
+function hook_media_bulk_upload_file_ids_alter(&$file_ids, string $media_bulk_config_id, array $context) {
+  $form = $context['form'];
+  if ($media_bulk_config_id === 'foo' && $form['file_upload']['#type'] === 'dropzonejs') {
+    // Handle 'foo' dropzonejs uploads in a different manner.
+    $file_ids = [1,2];
+  }
+}
+
+/**
+ * @} End of "addtogroup hooks".
+ */
diff --git a/modules/dropzonejs/media_bulk_upload_dropzonejs.module b/modules/dropzonejs/media_bulk_upload_dropzonejs.module
index 019f5a59b3857a0d9fe94f796f599ca6560de34a..324c574fc84bf38810eee15ebd849db1e8895992 100644
--- a/modules/dropzonejs/media_bulk_upload_dropzonejs.module
+++ b/modules/dropzonejs/media_bulk_upload_dropzonejs.module
@@ -1,45 +1,43 @@
 <?php
 
-use Drupal\Core\Entity\EntityInterface;
 use Drupal\Core\StringTranslation\TranslatableMarkup;
 use Drupal\Core\Form\FormStateInterface;
-use Drupal\file\FileInterface;
 
 /**
  * Implements hook_media_bulk_upload_file_ids_alter().
- *
- * @param array $file_ids
- * @param string $media_bulk_config_id
- *
- * @return void
  */
-function media_bulk_upload_dropzonejs_media_bulk_upload_file_ids_alter(array &$file_ids, string $media_bulk_config_id) {
-  if (!isset($file_ids['uploaded_files'])) {
+function media_bulk_upload_dropzonejs_media_bulk_upload_file_ids_alter(array &$file_ids, string $media_bulk_config_id, array $context) {
+  $form = $context['form'];
+  if (empty($file_ids['uploaded_files']) || $form['file_upload']['#type'] !== 'dropzonejs') {
     return;
   }
 
+  /** @var \Drupal\Core\File\FileSystemInterface $fileSystem */
+  $fileSystem = \Drupal::service('file_system');
+
+  /** @var \Drupal\dropzonejs\DropzoneJsUploadSaveInterface $dropzoneJsUploadSave */
+  $dropzoneJsUploadSave = \Drupal::service('dropzonejs.upload_save');
   $fileIds = [];
-  $fileStorage = \Drupal::entityTypeManager()->getStorage('file');
+
+  $currentUser = \Drupal::currentUser();
+  $extensions = $form['file_upload']['#extensions'] ?? '';
+  $validators = $form['file_upload']['#upload_validators'] ?? [];
 
   foreach ($file_ids['uploaded_files'] as $fileData) {
-    if (!is_array($fileData) || !isset($fileData['path'])) {
+    if (!is_array($fileData) || !isset($fileData['path']) || !file_exists($fileData['path'])) {
       continue;
     }
 
-    /** @var \Drupal\file\FileInterface $fileEntity */
-    $fileEntity = $fileStorage->create([
-      'uri' => $fileData['path'],
-      'uid' => \Drupal::currentUser()->id(),
-      'status' => FILE_STATUS_PERMANENT,
-      'filename' => $fileData['filename'],
-    ]);
-    $fileEntity->save();
-    $fileIds[] = $fileEntity->id();
+    $destination = $fileSystem->dirname($fileData['path']);
+    $file = $dropzoneJsUploadSave->createFile($fileData['path'], $destination, $extensions, $currentUser, $validators);
+    if ($file) {
+      $file->setPermanent();
+      $file->save();
+      $fileIds[] = $file->id();
+    }
   }
 
-  if (!empty($fileIds)) {
-    $file_ids = $fileIds;
-  }
+  $file_ids = $fileIds;
 }
 
 /**
@@ -49,7 +47,6 @@ function media_bulk_upload_dropzonejs_form_media_bulk_upload_form_alter(
   &$form,
   FormStateInterface $form_state
 ) {
-
   $form['file_upload']['#type'] = 'dropzonejs';
   $form['file_upload']['#disable_form_buttons'] = '.button.form-submit';
   $form['file_upload']['#dropzone_description'] = new TranslatableMarkup('Click or drop your files here');
diff --git a/src/Form/MediaBulkUploadForm.php b/src/Form/MediaBulkUploadForm.php
index 32a6a01984e38b41ce1c0ac0b2c39ddb81d4a2e5..3dbae4bdc58c6550842f14f29f19b1d85665bd6c 100644
--- a/src/Form/MediaBulkUploadForm.php
+++ b/src/Form/MediaBulkUploadForm.php
@@ -326,7 +326,13 @@ class MediaBulkUploadForm extends FormBase {
     $mediaBulkConfig = $this->mediaBulkConfigStorage->load($mediaBundleConfigId);
     $fileIds = $values['file_upload'];
 
-    \Drupal::moduleHandler()->alter('media_bulk_upload_file_ids', $fileIds, $mediaBundleConfigId);
+    $mediaBulkUploadContext = [
+      'media_bulk_upload_form' => $this,
+      'form' => $form,
+      'form_state' => $form_state,
+      'media_bulk_config' => $mediaBulkConfig,
+    ];
+    \Drupal::moduleHandler()->alter('media_bulk_upload_file_ids', $fileIds, $mediaBundleConfigId, $mediaBulkUploadContext);
 
     if (empty($fileIds)) {
       return;
