core/modules/file/file.services.yml | 2 +- core/modules/file/src/FileFieldUploader.php | 16 ++++- .../Plugin/rest/resource/FileUploadResource.php | 82 +++++++++++++++++++--- 3 files changed, 87 insertions(+), 13 deletions(-) diff --git a/core/modules/file/file.services.yml b/core/modules/file/file.services.yml index 3db675065c..472c196005 100644 --- a/core/modules/file/file.services.yml +++ b/core/modules/file/file.services.yml @@ -7,4 +7,4 @@ services: file.uploader.field: class: Drupal\file\FileFieldUploader - arguments: ['@logger.channel.file', '@file_system', '@file.mime_type.guesser', '@token', '@lock', '@config.factory'] + arguments: ['@entity_type.manager', '@logger.channel.file', '@file_system', '@file.mime_type.guesser', '@token', '@lock', '@config.factory'] diff --git a/core/modules/file/src/FileFieldUploader.php b/core/modules/file/src/FileFieldUploader.php index a0ae183d42..325e932d0d 100644 --- a/core/modules/file/src/FileFieldUploader.php +++ b/core/modules/file/src/FileFieldUploader.php @@ -5,6 +5,7 @@ use Drupal\Component\Utility\Bytes; use Drupal\Component\Utility\Crypt; use Drupal\Core\Entity\EntityInterface; +use Drupal\Core\Entity\EntityTypeManagerInterface; use Drupal\Core\Entity\Plugin\DataType\EntityAdapter; use Drupal\Core\Field\FieldDefinitionInterface; use Drupal\Core\Validation\DrupalTranslator; @@ -15,7 +16,6 @@ use Drupal\Core\Session\AccountInterface; use Drupal\Core\Utility\Token; use Drupal\Component\Render\PlainTextOutput; -use Drupal\file\Entity\File; use Drupal\file\Plugin\Field\FieldType\FileFieldItemList; use Psr\Log\LoggerInterface; use Symfony\Component\HttpFoundation\File\MimeType\MimeTypeGuesserInterface; @@ -53,6 +53,13 @@ class FileFieldUploader { */ const BYTES_TO_READ = 8192; + /** + * The entity type manager. + * + * @var \Drupal\Core\Entity\EntityTypeManagerInterface + */ + protected $entityTypeManager; + /** * A logger instance. * @@ -98,6 +105,8 @@ class FileFieldUploader { /** * Constructs a FileUploadResource instance. * + * @param \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager + * The entity type manager. * @param \Psr\Log\LoggerInterface $logger * A logger instance. * @param \Drupal\Core\File\FileSystemInterface $file_system @@ -111,7 +120,8 @@ class FileFieldUploader { * @param \Drupal\Core\Config\ConfigFactoryInterface $config_factory * The config factory. */ - public function __construct(LoggerInterface $logger, FileSystemInterface $file_system, MimeTypeGuesserInterface $mime_type_guesser, Token $token, LockBackendInterface $lock, ConfigFactoryInterface $config_factory) { + public function __construct(EntityTypeManagerInterface $entity_type_manager, LoggerInterface $logger, FileSystemInterface $file_system, MimeTypeGuesserInterface $mime_type_guesser, Token $token, LockBackendInterface $lock, ConfigFactoryInterface $config_factory) { + $this->entityTypeManager = $entity_type_manager; $this->logger = $logger; $this->fileSystem = $file_system; $this->mimeTypeGuesser = $mime_type_guesser; @@ -170,7 +180,7 @@ public function handleFileUploadForField(FieldDefinitionInterface $field_definit } // Begin building file entity. - $file = File::create([]); + $file = $this->entityTypeManager->getStorage('file')->create([]); $file->setOwnerId($owner->id()); $file->setFilename($prepared_filename); $file->setMimeType($this->mimeTypeGuesser->guess($prepared_filename)); diff --git a/core/modules/file/src/Plugin/rest/resource/FileUploadResource.php b/core/modules/file/src/Plugin/rest/resource/FileUploadResource.php index 82e42c1fa5..dc4e592720 100644 --- a/core/modules/file/src/Plugin/rest/resource/FileUploadResource.php +++ b/core/modules/file/src/Plugin/rest/resource/FileUploadResource.php @@ -2,9 +2,13 @@ namespace Drupal\file\Plugin\rest\resource; +use Drupal\Core\Config\Config; use Drupal\Core\Entity\EntityConstraintViolationListInterface; use Drupal\Core\Entity\EntityTypeManagerInterface; +use Drupal\Core\File\FileSystemInterface; +use Drupal\Core\Lock\LockBackendInterface; use Drupal\Core\Session\AccountInterface; +use Drupal\Core\Utility\Token; use Drupal\file\FileFieldUploader; use Drupal\rest\ModifiedResourceResponse; use Drupal\rest\Plugin\ResourceBase; @@ -14,6 +18,7 @@ use Drupal\rest\RequestHandler; use Psr\Log\LoggerInterface; use Symfony\Component\DependencyInjection\ContainerInterface; +use Symfony\Component\HttpFoundation\File\MimeType\MimeTypeGuesserInterface; use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException; use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; use Symfony\Component\HttpKernel\Exception\UnprocessableEntityHttpException; @@ -62,11 +67,11 @@ class FileUploadResource extends ResourceBase { const BYTES_TO_READ = 8192; /** - * The file field uploader. + * The file system service. * - * @var \Drupal\file\FileFieldUploader + * @var \Drupal\Core\File\FileSystemInterface */ - protected $fileFieldUploader; + protected $fileSystem; /** * The entity type manager. @@ -89,6 +94,39 @@ class FileUploadResource extends ResourceBase { */ protected $currentUser; + /** + * The MIME type guesser. + * + * @var \Symfony\Component\HttpFoundation\File\MimeType\MimeTypeGuesserInterface + */ + protected $mimeTypeGuesser; + + /** + * The token replacement instance. + * + * @var \Drupal\Core\Utility\Token + */ + protected $token; + + /** + * The lock service. + * + * @var \Drupal\Core\Lock\LockBackendInterface + */ + protected $lock; + + /** + * @var \Drupal\Core\Config\ImmutableConfig + */ + protected $systemFileConfig; + + /** + * The file field uploader. + * + * @var \Drupal\file\FileFieldUploader + */ + protected $fileFieldUploader; + /** * Constructs a FileUploadResource instance. * @@ -102,21 +140,42 @@ class FileUploadResource extends ResourceBase { * The available serialization formats. * @param \Psr\Log\LoggerInterface $logger * A logger instance. - * @param \Drupal\file\FileFieldUploader $file_field_uploader - * The file field uploader service. + * @param \Drupal\Core\File\FileSystemInterface $file_system + * The file system service. * @param \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager * The entity type manager. * @param \Drupal\Core\Entity\EntityFieldManagerInterface $entity_field_manager * The entity field manager. * @param \Drupal\Core\Session\AccountInterface $current_user * The currently authenticated user. + * @param \Symfony\Component\HttpFoundation\File\MimeType\MimeTypeGuesserInterface $mime_type_guesser + * The MIME type guesser. + * @param \Drupal\Core\Utility\Token $token + * The token replacement instance. + * @param \Drupal\Core\Lock\LockBackendInterface $lock + * The lock service. + * @param \Drupal\Core\Config\Config $system_file_config + * The system file configuration. + * @param \Drupal\file\FileFieldUploader $file_field_uploader + * The file field uploader. */ - public function __construct(array $configuration, $plugin_id, $plugin_definition, $serializer_formats, LoggerInterface $logger, FileFieldUploader $file_field_uploader, EntityTypeManagerInterface $entity_type_manager, EntityFieldManagerInterface $entity_field_manager, AccountInterface $current_user) { + public function __construct(array $configuration, $plugin_id, $plugin_definition, $serializer_formats, LoggerInterface $logger, FileSystemInterface $file_system, EntityTypeManagerInterface $entity_type_manager, EntityFieldManagerInterface $entity_field_manager, AccountInterface $current_user, MimeTypeGuesserInterface $mime_type_guesser, Token $token, LockBackendInterface $lock, Config $system_file_config, FileFieldUploader $file_field_uploader = NULL) { parent::__construct($configuration, $plugin_id, $plugin_definition, $serializer_formats, $logger); - $this->fileFieldUploader = $file_field_uploader; + $this->fileSystem = $file_system; $this->entityTypeManager = $entity_type_manager; $this->entityFieldManager = $entity_field_manager; $this->currentUser = $current_user; + $this->mimeTypeGuesser = $mime_type_guesser; + $this->token = $token; + $this->lock = $lock; + $this->systemFileConfig = $system_file_config; + if ($file_field_uploader instanceof FileFieldUploader) { + $this->fileFieldUploader = $file_field_uploader; + } + else { + @trigger_error("The 'file.uploader.field' service must be passed to FileUploadResource::__construct(), it is required before Drupal 9.0.0. See https://www.drupal.org/project/drupal/issues/2940383.", E_USER_DEPRECATED); + $this->fileFieldUploader = \Drupal::service('file.uploader.field'); + } } /** @@ -129,10 +188,15 @@ public static function create(ContainerInterface $container, array $configuratio $plugin_definition, $container->getParameter('serializer.formats'), $container->get('logger.factory')->get('rest'), - $container->get('file.uploader.field'), + $container->get('file_system'), $container->get('entity_type.manager'), $container->get('entity_field.manager'), - $container->get('current_user') + $container->get('current_user'), + $container->get('file.mime_type.guesser'), + $container->get('token'), + $container->get('lock'), + $container->get('config.factory')->get('system.file'), + $container->get('file.uploader.field') ); }