diff --git a/core/modules/file/src/Plugin/rest/resource/FileUploadResource.php b/core/modules/file/src/Plugin/rest/resource/FileUploadResource.php
index 5b1c1fb6bf1762d1d773080d0a0f06e368eba2b6..15aed5280030271f71ad31b0ae4ccf435dba11bc 100644
--- a/core/modules/file/src/Plugin/rest/resource/FileUploadResource.php
+++ b/core/modules/file/src/Plugin/rest/resource/FileUploadResource.php
@@ -17,6 +17,7 @@
 use Drupal\Core\Utility\Token;
 use Drupal\file\Entity\File;
 use Drupal\file\Upload\ContentDispositionFilenameParser;
+use Drupal\file\Upload\FileUploadLocationTrait;
 use Drupal\file\Upload\InputStreamFileWriterInterface;
 use Drupal\file\Validation\FileValidatorInterface;
 use Drupal\file\Validation\FileValidatorSettingsTrait;
@@ -63,6 +64,9 @@ class FileUploadResource extends ResourceBase {
   use EntityResourceValidationTrait {
     validate as resourceValidate;
   }
+  use FileUploadLocationTrait {
+    getUploadLocation as getUploadDestination;
+  }
 
   /**
    * The regex used to extract the filename from the content disposition header.
@@ -282,7 +286,7 @@ public function post(Request $request, $entity_type_id, $bundle, $field_name) {
 
     $field_definition = $this->validateAndLoadFieldDefinition($entity_type_id, $bundle, $field_name);
 
-    $destination = $this->getUploadLocation($field_definition->getSettings());
+    $destination = $this->getUploadDestination($field_definition);
 
     // Check the destination file path is writable.
     if (!$this->fileSystem->prepareDirectory($destination, FileSystemInterface::CREATE_DIRECTORY)) {
@@ -491,8 +495,14 @@ protected function prepareFilename($filename, array &$validators) {
    * @return string
    *   An un-sanitized file directory URI with tokens replaced. The result of
    *   the token replacement is then converted to plain text and returned.
+   *
+   * @deprecated in drupal:10.3.0 and is removed from drupal:11.0.0. Use
+   * \Drupal\file\Upload\FileUploadLocationTrait::getUploadLocation() instead.
+   *
+   * @see https://www.drupal.org/node/3406099
    */
   protected function getUploadLocation(array $settings) {
+    @\trigger_error(__METHOD__ . ' is deprecated in drupal:10.3.0 and is removed from drupal:11.0.0. Use \Drupal\file\Upload\FileUploadLocationTrait::getUploadLocation() instead. See https://www.drupal.org/node/3406099', E_USER_DEPRECATED);
     $destination = trim($settings['file_directory'], '/');
 
     // Replace tokens. As the tokens might contain HTML we convert it to plain
diff --git a/core/modules/file/src/Upload/FileUploadLocationTrait.php b/core/modules/file/src/Upload/FileUploadLocationTrait.php
new file mode 100644
index 0000000000000000000000000000000000000000..20b785bf9b43de939f1d09684a0a92c436dc80d3
--- /dev/null
+++ b/core/modules/file/src/Upload/FileUploadLocationTrait.php
@@ -0,0 +1,32 @@
+<?php
+
+namespace Drupal\file\Upload;
+
+use Drupal\Core\Field\FieldDefinitionInterface;
+use Drupal\Core\Field\TypedData\FieldItemDataDefinition;
+use Drupal\file\Plugin\Field\FieldType\FileFieldItemList;
+use Drupal\file\Plugin\Field\FieldType\FileItem;
+
+/**
+ * Resolves the file upload location from a file field definition.
+ */
+trait FileUploadLocationTrait {
+
+  /**
+   * Resolves the file upload location from a file field definition.
+   *
+   * @param \Drupal\Core\Field\FieldDefinitionInterface $fieldDefinition
+   *   The file field definition.
+   *
+   * @return string
+   *   An un-sanitized file directory URI with tokens replaced. The result of
+   *   the token replacement is then converted to plain text and returned.
+   */
+  public function getUploadLocation(FieldDefinitionInterface $fieldDefinition): string {
+    assert(is_a($fieldDefinition->getClass(), FileFieldItemList::class, TRUE));
+    $fieldItemDataDefinition = FieldItemDataDefinition::create($fieldDefinition);
+    $fileItem = new FileItem($fieldItemDataDefinition);
+    return $fileItem->getUploadLocation();
+  }
+
+}
diff --git a/core/modules/jsonapi/src/Controller/TemporaryJsonapiFileFieldUploader.php b/core/modules/jsonapi/src/Controller/TemporaryJsonapiFileFieldUploader.php
index 50b269f13fa8d4f347dd425af1dea5faa47be985..a8ca4066f737afed93a808de99bda9237bb48e04 100644
--- a/core/modules/jsonapi/src/Controller/TemporaryJsonapiFileFieldUploader.php
+++ b/core/modules/jsonapi/src/Controller/TemporaryJsonapiFileFieldUploader.php
@@ -19,6 +19,7 @@
 use Drupal\file\FileInterface;
 use Drupal\file\Plugin\Field\FieldType\FileFieldItemList;
 use Drupal\file\Upload\ContentDispositionFilenameParser;
+use Drupal\file\Upload\FileUploadLocationTrait;
 use Drupal\file\Upload\InputStreamFileWriterInterface;
 use Drupal\file\Validation\FileValidatorInterface;
 use Drupal\file\Validation\FileValidatorSettingsTrait;
@@ -46,6 +47,9 @@
 class TemporaryJsonapiFileFieldUploader {
 
   use FileValidatorSettingsTrait;
+  use FileUploadLocationTrait {
+    getUploadLocation as getUploadDestination;
+  }
 
   /**
    * The regex used to extract the filename from the content disposition header.
@@ -201,7 +205,7 @@ public function __construct(LoggerInterface $logger, FileSystemInterface $file_s
   public function handleFileUploadForField(FieldDefinitionInterface $field_definition, $filename, AccountInterface $owner) {
     assert(is_a($field_definition->getClass(), FileFieldItemList::class, TRUE));
     $settings = $field_definition->getSettings();
-    $destination = $this->getUploadLocation($settings);
+    $destination = $this->getUploadDestination($field_definition);
 
     // Check the destination file path is writable.
     if (!$this->fileSystem->prepareDirectory($destination, FileSystemInterface::CREATE_DIRECTORY)) {
@@ -428,8 +432,14 @@ protected function prepareFilename($filename, array &$validators) {
    * @return string
    *   An un-sanitized file directory URI with tokens replaced. The result of
    *   the token replacement is then converted to plain text and returned.
+   *
+   * @deprecated in drupal:10.3.0 and is removed from drupal:11.0.0. Use
+   *   \Drupal\file\Upload\FileUploadLocationTrait::getUploadLocation() instead.
+   *
+   * @see https://www.drupal.org/node/3406099
    */
   protected function getUploadLocation(array $settings) {
+    @\trigger_error(__METHOD__ . ' is deprecated in drupal:10.3.0 and is removed from drupal:11.0.0. Use \Drupal\file\Upload\FileUploadLocationTrait::getUploadLocation() instead. See https://www.drupal.org/node/3406099', E_USER_DEPRECATED);
     $destination = trim($settings['file_directory'], '/');
 
     // Replace tokens. As the tokens might contain HTML we convert it to plain