You are here

public function DownloadController::save in Media Download 1.2.x

Same name and namespace in other branches
  1. 1.0.x src/DownloadController.php \Drupal\media_download\DownloadController::save()
  2. 1.1.x src/DownloadController.php \Drupal\media_download\DownloadController::save()

Download the primary file resource referenced by the supplied media entity.

By default, an inline content disposition is used to allow the media file to be viewed in the browser. If `dl=1` is passed as a query parameter, then the browser will be instructed to save the file to disk.

Parameters

\Drupal\media\MediaInterface $media: The media entity for which to initiate a file download.

\Symfony\Component\HttpFoundation\Request $request: The current request.

Return value

\Drupal\media_download\CacheableBinaryFileResponse A cacheable binary file response.

Throws

\Symfony\Component\HttpKernel\Exception\NotFoundHttpException When a valid file cannot be found for the supplied media entity.

File

src/DownloadController.php, line 84

Class

DownloadController
Adds support for direct downloads of media entities.

Namespace

Drupal\media_download

Code

public function save(MediaInterface $media, Request $request) {
  $cacheability = new CacheableMetadata();

  // Ensure that a file is referenced by the source field, and it exists.
  if (empty($file = $this
    ->getFile($media))) {
    throw new NotFoundHttpException("There is no file associated with the requested entity.");
  }

  // Add both the media entity and the file entity that it references as
  // cacheable dependencies for this response.
  $cacheability
    ->addCacheableDependency($file);
  $cacheability
    ->addCacheableDependency($media);

  // Since the content disposition header depends on the query string, ensure
  // that the query string is part of the cache metadata.
  $cacheability
    ->addCacheContexts([
    'url.query_args:dl',
  ]);

  // Create a new response object to download the requested file.
  $response = new CacheableBinaryFileResponse($file
    ->getFileUri());
  $response
    ->addCacheableDependency($cacheability);

  // Force a direct download if dl=1 is in the query string.
  if ($request->query
    ->get('dl') === '1') {
    $response
      ->setContentDisposition('attachment');
  }
  else {
    $response
      ->setContentDisposition('inline');
  }

  // Clear the Cache-Control header so it can be calculated automatically.
  $response->headers
    ->set('Cache-Control', '');

  // Automatically calculate the ETag and Last-Modified headers.
  $response
    ->setAutoEtag();
  $response
    ->setAutoLastModified();
  return $response;
}