Verified Commit 7a127108 authored by Alex Pott's avatar Alex Pott
Browse files

Issue #3389688 by kim.pepper, smustgrave, alexpott, quietone: Add a trait to...

Issue #3389688 by kim.pepper, smustgrave, alexpott, quietone: Add a trait to get file upload location from a field definition
parent 0dac7cab
Loading
Loading
Loading
Loading
Loading
+11 −1
Original line number Diff line number Diff line
@@ -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
+32 −0
Original line number Diff line number Diff line
<?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();
  }

}
+11 −1
Original line number Diff line number Diff line
@@ -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