diff --git a/src/Plugin/views/display/DataExport.php b/src/Plugin/views/display/DataExport.php
index 17e06290818b315fc7a41d67315cd1dac13bccc7..1e13b4a80d4152597efa8a1d85316c97775eade9 100644
--- a/src/Plugin/views/display/DataExport.php
+++ b/src/Plugin/views/display/DataExport.php
@@ -10,6 +10,7 @@ use Drupal\Core\File\FileSystemInterface;
 use Drupal\Core\Form\FormStateInterface;
 use Drupal\Core\Render\BubbleableMetadata;
 use Drupal\Core\Url;
+use Drupal\file\Entity\File;
 use Drupal\rest\Plugin\views\display\RestExport;
 use Drupal\search_api\Plugin\views\query\SearchApiQuery;
 use Drupal\views\ViewExecutable;
@@ -725,22 +726,7 @@ class DataExport extends RestExport {
 
       $user_dir = $user_ID ? "$user_ID-$timestamp" : $timestamp;
       $view_dir = $view_id . '_' . $display_id;
-
-      // Determine if the export file should be stored in the public or private
-      // file system.
-      $store_in_public_file_directory = TRUE;
-      $streamWrapperManager = \Drupal::service('stream_wrapper_manager');
-      // Check if the private file system is ready to use.
-      if ($streamWrapperManager->isValidScheme('private')) {
-        $store_in_public_file_directory = $view->getDisplay()->getOption('store_in_public_file_directory');
-      }
-
-      if ($store_in_public_file_directory === TRUE) {
-        $directory = "public://views_data_export/$view_dir/$user_dir/";
-      }
-      else {
-        $directory = "private://views_data_export/$view_dir/$user_dir/";
-      }
+      $directory = "temporary://views_data_export/$view_dir/$user_dir/";
 
       try {
         $fileSystem = \Drupal::service('file_system');
@@ -883,6 +869,53 @@ class DataExport extends RestExport {
       $context['finished'] = $context['sandbox']['progress'] / $total_rows;
     }
     else {
+      $temp_file_uri = $context['results']['vde_file'];
+      // Determine if the export file should be stored in the public or private
+      // file system.
+      $store_in_public_file_directory = TRUE;
+      $streamWrapperManager = \Drupal::service('stream_wrapper_manager');
+      // Check if the private file system is ready to use.
+      if ($streamWrapperManager->isValidScheme('private')) {
+        $store_in_public_file_directory = $view->getDisplay()->getOption('store_in_public_file_directory');
+      }
+      if ($store_in_public_file_directory === TRUE) {
+        $destination_file_uri = str_replace('temporary://', 'public://', $temp_file_uri);
+      }
+      else {
+        $destination_file_uri = str_replace('temporary://', 'private://', $temp_file_uri);
+      }
+      $dirname = \Drupal::service('file_system')->dirname($destination_file_uri);
+      \Drupal::service('file_system')->prepareDirectory($dirname, FileSystemInterface::CREATE_DIRECTORY);
+      \Drupal::service('file_system')->copy($temp_file_uri, $destination_file_uri, FileSystemInterface::CREATE_DIRECTORY);
+
+      // Find the file entity with the temporary URI.
+      $database = \Drupal::database();
+      $query = $database->select('file_managed', 'f')
+        ->fields('f', ['fid'])
+        ->condition('uri', $temp_file_uri, '=')
+        ->execute();
+      $fid = $query->fetchField();
+
+      // If file is found, update its URI to the private destination.
+      if ($fid) {
+        $file = File::load($fid);
+        if ($file) {
+          $file->setFileUri($destination_file_uri);
+          $file->save();
+          \Drupal::logger('views_data_export')->info('Updated file URI from @old to @new', [
+            '@old' => $temp_file_uri,
+            '@new' => $destination_file_uri,
+          ]);
+        }
+      }
+      else {
+        \Drupal::logger('views_data_export')->warning('Could not find file with URI @uri to update', [
+          '@uri' => $temp_file_uri,
+        ]);
+      }
+
+      \Drupal::service('file_system')->delete($temp_file_uri);
+      $context['results']['vde_file'] = $destination_file_uri;
       // We're finished processing, set progress bar to 100%.
       $context['finished'] = 1;
     }