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