You are here

public function DownloadController::download in Media Entity Download 8

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

Serves the file upon request.

Parameters

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

Return value

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

Throws

\Exception

NotFoundHttpException

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 56

Class

DownloadController
DownloadController class.

Namespace

Drupal\media_entity_download\Controller

Code

public function download(MediaInterface $media) {
  $bundle = $media
    ->bundle();
  $config = $this
    ->config('media_entity.bundle.' . $bundle);
  $type_config = $config
    ->get('type_configuration');
  $field = $type_config['source_field'];

  // 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 = $this->requestStack
    ->getCurrentRequest()->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();
  $filename = $file
    ->getFilename();

  // Or item does not exist on disk.
  if (!file_exists($uri)) {
    throw new NotFoundHttpException("The file {$uri} does not exist.");
  }
  $response = new BinaryFileResponse($uri);
  $response
    ->setContentDisposition(ResponseHeaderBag::DISPOSITION_ATTACHMENT, $filename);
  return $response;
}