You are here

class S3CorsUploadAjaxController in Flysystem - S3 2.0.x

Same name and namespace in other branches
  1. 8 src/Controller/S3CorsUploadAjaxController.php \Drupal\flysystem_s3\Controller\S3CorsUploadAjaxController

Defines a controller to respond to S3 CORS upload AJAX requests.

Hierarchy

Expanded class hierarchy of S3CorsUploadAjaxController

File

src/Controller/S3CorsUploadAjaxController.php, line 18

Namespace

Drupal\flysystem_s3\Controller
View source
class S3CorsUploadAjaxController extends ControllerBase {

  /**
   * The form builder.
   *
   * @var \Drupal\flysystem\FlysystemFactory
   */
  protected $flysystemFactory;

  /**
   * The file system.
   *
   * @var \Drupal\Core\File\FileSystemInterface
   */
  protected $fileSystem;

  /**
   * {@inheritdoc}
   */
  public static function create(ContainerInterface $container) {
    return new static($container
      ->get('flysystem_factory'), $container
      ->get('file_system'));
  }

  /**
   * Constructs an S3CorsUploadAjaxController object.
   *
   * @param \Drupal\flysystem\FlysystemFactory $flysystem_factory
   *   The Flysystem factory.
   * @param \Drupal\Core\File\FileSystemInterface $file_system
   *   The file system.
   */
  public function __construct(FlysystemFactory $flysystem_factory, FileSystemInterface $file_system) {
    $this->flysystemFactory = $flysystem_factory;
    $this->fileSystem = $file_system;
  }

  /**
   * Returns the signed request.
   *
   * @param \Symfony\Component\HttpFoundation\Request $request
   *   The current request.
   *
   * @return \Symfony\Component\HttpFoundation\JsonResponse
   *   A JsonResponse object.
   */
  public function signRequest(Request $request) {
    $post = $request->request
      ->all();

    /** @var \Drupal\flysystem_s3\Flysystem\Adapter\S3Adapter $adapter */
    $scheme = \Drupal::service('file_system')
      ->uriScheme($post['destination']);
    $adapter = $this->flysystemFactory
      ->getPlugin($scheme)
      ->getAdapter();
    $client = $adapter
      ->getClient();
    $bucket = $adapter
      ->getBucket();
    $destination = $adapter
      ->applyPathPrefix(StreamWrapperManager::getTarget($post['destination']));
    $options = [
      [
        'acl' => $post['acl'],
      ],
      [
        'bucket' => $bucket,
      ],
      [
        'starts-with',
        '$key',
        $destination . '/',
      ],
    ];

    // Retrieve the file name and build the URI.
    // Destination does not contain a prefix as it is applied by the fly system.
    $uri = \Drupal::service('file_system')
      ->createFilename($post['filename'], $post['destination']);

    // Apply the prefix to the URI and use it as a key in the POST request.
    $post['key'] = $adapter
      ->applyPathPrefix(StreamWrapperManager::getTarget($uri));

    // Create a temporary file to return with a file ID in the response.
    $file = File::create([
      'uri' => $post['key'],
      'filesize' => $post['filesize'],
      'filename' => $post['filename'],
      'filemime' => $post['filemime'],
      'uid' => \Drupal::currentUser()
        ->getAccount()
        ->id(),
    ]);
    $file
      ->save();

    // Remove values not necessary for the request to Amazon.
    unset($post['destination']);
    unset($post['filename']);
    unset($post['filemime']);
    unset($post['filesize']);

    // @todo Make this interval configurable.
    $expiration = '+5 hours';
    $postObject = new PostObjectV4($client, $bucket, $post, $options, $expiration);
    $data = [];
    $data['attributes'] = $postObject
      ->getFormAttributes();
    $data['inputs'] = $postObject
      ->getFormInputs();
    $data['options'] = $options;
    $data['fid'] = $file
      ->id();
    return new JsonResponse($data);
  }

}

Members

Namesort descending Modifiers Type Description Overrides
ControllerBase::$configFactory protected property The configuration factory.
ControllerBase::$currentUser protected property The current user service. 1
ControllerBase::$entityFormBuilder protected property The entity form builder.
ControllerBase::$entityTypeManager protected property The entity type manager.
ControllerBase::$formBuilder protected property The form builder. 2
ControllerBase::$keyValue protected property The key-value storage. 1
ControllerBase::$languageManager protected property The language manager. 1
ControllerBase::$moduleHandler protected property The module handler. 2
ControllerBase::$stateService protected property The state service.
ControllerBase::cache protected function Returns the requested cache bin.
ControllerBase::config protected function Retrieves a configuration object.
ControllerBase::container private function Returns the service container.
ControllerBase::currentUser protected function Returns the current user. 1
ControllerBase::entityFormBuilder protected function Retrieves the entity form builder.
ControllerBase::entityTypeManager protected function Retrieves the entity type manager.
ControllerBase::formBuilder protected function Returns the form builder service. 2
ControllerBase::keyValue protected function Returns a key/value storage collection. 1
ControllerBase::languageManager protected function Returns the language manager service. 1
ControllerBase::moduleHandler protected function Returns the module handler. 2
ControllerBase::redirect protected function Returns a redirect response object for the specified route.
ControllerBase::state protected function Returns the state storage service.
LoggerChannelTrait::$loggerFactory protected property The logger channel factory service.
LoggerChannelTrait::getLogger protected function Gets the logger for a specific channel.
LoggerChannelTrait::setLoggerFactory public function Injects the logger channel factory.
MessengerTrait::$messenger protected property The messenger. 27
MessengerTrait::messenger public function Gets the messenger. 27
MessengerTrait::setMessenger public function Sets the messenger.
RedirectDestinationTrait::$redirectDestination protected property The redirect destination service. 1
RedirectDestinationTrait::getDestinationArray protected function Prepares a 'destination' URL query parameter for use with \Drupal\Core\Url.
RedirectDestinationTrait::getRedirectDestination protected function Returns the redirect destination service.
RedirectDestinationTrait::setRedirectDestination public function Sets the redirect destination service.
S3CorsUploadAjaxController::$fileSystem protected property The file system.
S3CorsUploadAjaxController::$flysystemFactory protected property The form builder.
S3CorsUploadAjaxController::create public static function Instantiates a new instance of this class. Overrides ControllerBase::create
S3CorsUploadAjaxController::signRequest public function Returns the signed request.
S3CorsUploadAjaxController::__construct public function Constructs an S3CorsUploadAjaxController object.
StringTranslationTrait::$stringTranslation protected property The string translation service. 4
StringTranslationTrait::formatPlural protected function Formats a string containing a count of items.
StringTranslationTrait::getNumberOfPlurals protected function Returns the number of plurals supported by a given language.
StringTranslationTrait::getStringTranslation protected function Gets the string translation service.
StringTranslationTrait::setStringTranslation public function Sets the string translation service to use. 2
StringTranslationTrait::t protected function Translates a string to the current language or to a given language.