/** * Download a file. * Outputs HTTP headers and file content for download * @param $filePath string the location of the file to be sent * @param $mediaType string the MIME type of the file, optional * @param $inline print file as inline instead of attachment, optional * @return boolean */ function downloadFile($filePath, $mediaType = null, $inline = false, $fileName = null) { $result = null; if (HookRegistry::call('FileManager::downloadFile', array(&$filePath, &$mediaType, &$inline, &$result, &$fileName))) { return $result; } $postDownloadHookList = array('FileManager::downloadFileFinished', 'UsageEventPlugin::getUsageEvent'); if (is_readable($filePath)) { if ($mediaType === null) { // If the media type wasn't specified, try to detect. $mediaType = String::mime_content_type($filePath); if (empty($mediaType)) { $mediaType = 'application/octet-stream'; } } if ($fileName === null) { // If the filename wasn't specified, use the server-side. $fileName = basename($filePath); } $postDownloadHooks = null; $hooks = HookRegistry::getHooks(); foreach ($postDownloadHookList as $hookName) { if (isset($hooks[$hookName])) { $postDownloadHooks[$hookName] = $hooks[$hookName]; } } unset($hooks); Registry::clear(); // Stream the file to the end user. header("Content-Type: {$mediaType}"); header('Content-Length: ' . filesize($filePath)); header('Content-Disposition: ' . ($inline ? 'inline' : 'attachment') . "; filename=\"{$fileName}\""); header('Cache-Control: private'); // Workarounds for IE weirdness header('Pragma: public'); // Beware of converting to instance call // https://github.com/pkp/pkp-lib/commit/82f4a36db406ecac3eb88875541a74123e455713#commitcomment-1459396 FileManager::readFile($filePath, true); if ($postDownloadHooks) { foreach ($postDownloadHooks as $hookName => $hooks) { HookRegistry::setHooks($hookName, $hooks); } } $returner = true; } else { $returner = false; } HookRegistry::call('FileManager::downloadFileFinished', array(&$returner)); return $returner; }
/** * Download a file. * Outputs HTTP headers and file content for download * @param $filePath string the location of the file to be sent * @param $mediaType string the MIME type of the file, optional * @param $inline print file as inline instead of attachment, optional * @return boolean */ function downloadFile($filePath, $mediaType = null, $inline = false, $fileName = null) { $result = null; if (HookRegistry::call('FileManager::downloadFile', array(&$filePath, &$mediaType, &$inline, &$result, &$fileName))) { return $result; } $postDownloadHookList = array('FileManager::downloadFileFinished', 'UsageEventPlugin::getUsageEvent'); if (is_readable($filePath)) { if ($mediaType === null) { // If the media type wasn't specified, try to detect. $mediaType = PKPString::mime_content_type($filePath); if (empty($mediaType)) { $mediaType = 'application/octet-stream'; } } if ($fileName === null) { // If the filename wasn't specified, use the server-side. $fileName = basename($filePath); } // Free some memory $postDownloadHooks = null; $hooks = HookRegistry::getHooks(); foreach ($postDownloadHookList as $hookName) { if (isset($hooks[$hookName])) { $postDownloadHooks[$hookName] = $hooks[$hookName]; } } unset($hooks); Registry::clear(); // Stream the file to the end user. header("Content-Type: {$mediaType}"); header('Content-Length: ' . filesize($filePath)); header('Content-Disposition: ' . ($inline ? 'inline' : 'attachment') . "; filename=\"{$fileName}\""); header('Cache-Control: private'); // Workarounds for IE weirdness header('Pragma: public'); $this->readFileFromPath($filePath, true); if ($postDownloadHooks) { foreach ($postDownloadHooks as $hookName => $hooks) { HookRegistry::setHooks($hookName, $hooks); } } $returner = true; } else { $returner = false; } HookRegistry::call('FileManager::downloadFileFinished', array(&$returner)); return $returner; }