You are here

public function DownloadController::download in Media Entity Download 8.2

Same name and namespace in other branches
  1. 8 src/Controller/DownloadController.php \Drupal\media_entity_download\Controller\DownloadController::download()

Serves the file upon request.

Parameters

\Drupal\media\MediaInterface $media: A valid media object.

Return value

\Symfony\Component\HttpFoundation\BinaryFileResponse Serve the file as the response.

Throws

\Exception

\Symfony\Component\HttpKernel\Exception\NotFoundHttpException

\Drupal\Component\Plugin\Exception\InvalidPluginDefinitionException

\Drupal\Component\Plugin\Exception\PluginNotFoundException

1 string reference to 'DownloadController::download'
media_entity_download.routing.yml in ./media_entity_download.routing.yml
media_entity_download.routing.yml

File

src/Controller/DownloadController.php, line 84

Class

DownloadController
DownloadController class.

Namespace

Drupal\media_entity_download\Controller

Code

public function download(MediaInterface $media) {
  $bundle = $media
    ->bundle();
  $source = $media
    ->getSource();
  $config = $source
    ->getConfiguration();
  $field = $config['source_field'];
  $request_query = $this->requestStack
    ->getCurrentRequest()->query;

  // This type has no source field configuration.
  if (!$field) {
    throw new \Exception("No source field configured for the {$bundle} media type.");
  }

  // If a delta was provided, use that.
  $delta = $request_query
    ->get('delta');

  // Get the ID of the requested file by its field delta.
  if (is_numeric($delta)) {
    $values = $media->{$field}
      ->getValue();
    if (isset($values[$delta])) {
      $fid = $values[$delta]['target_id'];
    }
    else {
      throw new NotFoundHttpException("The requested file could not be found.");
    }
  }
  else {
    $fid = $media->{$field}->target_id;
  }

  // If media has no file item.
  if (!$fid) {
    throw new NotFoundHttpException("The media item requested has no file referenced/uploaded in the {$field} field.");
  }
  $file = $this
    ->entityTypeManager()
    ->getStorage('file')
    ->load($fid);

  // Or file entity could not be loaded.
  if (!$file) {
    throw new \Exception("File id {$fid} could not be loaded.");
  }
  $uri = $file
    ->getFileUri();
  $scheme = $this->streamWrapperManager
    ->getScheme($uri);

  // Or item does not exist on disk.
  if (!$this->streamWrapperManager
    ->isValidScheme($scheme) || !file_exists($uri)) {
    throw new NotFoundHttpException("The file {$uri} does not exist.");
  }

  // Let other modules provide headers and controls access to the file.
  $headers = $this
    ->moduleHandler()
    ->invokeAll('file_download', [
    $uri,
  ]);
  foreach ($headers as $result) {
    if ($result == -1) {
      throw new AccessDeniedHttpException();
    }
  }
  if (count($headers)) {

    // \Drupal\Core\EventSubscriber\FinishResponseSubscriber::onRespond()
    // sets response as not cacheable if the Cache-Control header is not
    // already modified. We pass in FALSE for non-private schemes for the
    // $public parameter to make sure we don't change the headers.
    $response = new BinaryFileResponse($uri, Response::HTTP_OK, $headers, $scheme !== 'private');
    if (empty($headers['Content-Disposition'])) {
      if ($request_query
        ->has(ResponseHeaderBag::DISPOSITION_INLINE)) {
        $disposition = ResponseHeaderBag::DISPOSITION_INLINE;
      }
      else {
        $disposition = ResponseHeaderBag::DISPOSITION_ATTACHMENT;
      }
      $response
        ->setContentDisposition($disposition);
    }
    return $response;
  }
  throw new AccessDeniedHttpException();
}