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\DestinationCode
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.
}