You are here

function BrowserDownloadDestination::saveFile in Backup and Migrate 8.4

Save a file to the destination.

Parameters

\BackupMigrate\Core\File\BackupFileReadableInterface $file: The file to save.

Overrides StreamDestination::saveFile

1 call to BrowserDownloadDestination::saveFile()
DrupalBrowserDownloadDestination::saveFile in src/Destination/DrupalBrowserDownloadDestination.php
Save a file to the destination.
1 method overrides BrowserDownloadDestination::saveFile()
DrupalBrowserDownloadDestination::saveFile in src/Destination/DrupalBrowserDownloadDestination.php
Save a file to the destination.

File

lib/backup_migrate_core/src/Destination/BrowserDownloadDestination.php, line 21

Class

BrowserDownloadDestination
Class BrowserDownloadDestination.

Namespace

BackupMigrate\Core\Destination

Code

function saveFile(BackupFileReadableInterface $file) {

  // Set some default download headers.
  $headers = [
    [
      'key' => 'Content-Disposition',
      'value' => 'attachment; filename="' . $file
        ->getFullName() . '"',
    ],
    [
      'key' => 'Cache-Control',
      'value' => 'no-cache',
    ],
  ];

  // Set a mime-type header.
  if ($mime = $file
    ->getMeta('mimetype')) {
    $headers[] = [
      'key' => 'Content-Type',
      'value' => $mime,
    ];
  }
  else {

    // Get the mime type for this file if possible.
    $mime = 'application/octet-stream';
    $mime = $this
      ->plugins()
      ->call('alterMime', $mime, [
      'ext' => $file
        ->getExtLast(),
    ]);
    $headers[] = [
      'key' => 'Content-Type',
      'value' => $mime,
    ];
  }

  // In some circumstances, web-servers will double compress gzipped files.
  // This may help aleviate that issue by disabling mod-deflate.
  if ($file
    ->getMeta('mimetype') == 'application/x-gzip') {
    if (function_exists('apache_setenv')) {
      apache_setenv('no-gzip', '1');
    }
    $headers[] = [
      'key' => 'Content-Encoding',
      'value' => 'gzip',
    ];
  }
  if ($size = $file
    ->getMeta('filesize')) {
    $headers[] = [
      'key' => 'Content-Length',
      'value' => $size,
    ];
  }

  // Suppress the warning you get when the buffer is empty.
  @ob_end_clean();
  if ($file
    ->openForRead()) {
    foreach ($headers as $header) {

      // To prevent HTTP header injection, we delete new lines that are
      // not followed by a space or a tab.
      // See http://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html#sec4.2
      $header['value'] = preg_replace('/\\r?\\n(?!\\t| )/', '', $header['value']);
      header($header['key'] . ': ' . $header['value']);
    }

    // Transfer file in 1024 byte chunks to save memory usage.
    while ($data = $file
      ->readBytes(1024 * 512)) {
      print $data;
    }
    $file
      ->close();
  }

  // @TODO Throw exception.
}