%PDF- %PDF-
Direktori : /www/varak.net/losik.varak.net/vendor/nette/application/src/Application/Responses/ |
Current File : //www/varak.net/losik.varak.net/vendor/nette/application/src/Application/Responses/FileResponse.php |
<?php /** * This file is part of the Nette Framework (https://nette.org) * Copyright (c) 2004 David Grudl (https://davidgrudl.com) */ declare(strict_types=1); namespace Nette\Application\Responses; use Nette; /** * File download response. */ final class FileResponse implements Nette\Application\Response { use Nette\SmartObject; /** @var bool */ public $resuming = true; /** @var string */ private $file; /** @var string */ private $contentType; /** @var string */ private $name; /** @var bool */ private $forceDownload; public function __construct( string $file, ?string $name = null, ?string $contentType = null, bool $forceDownload = true ) { if (!is_file($file) || !is_readable($file)) { throw new Nette\Application\BadRequestException("File '$file' doesn't exist or is not readable."); } $this->file = $file; $this->name = $name ?? basename($file); $this->contentType = $contentType ?: 'application/octet-stream'; $this->forceDownload = $forceDownload; } /** * Returns the path to a downloaded file. */ public function getFile(): string { return $this->file; } /** * Returns the file name. */ public function getName(): string { return $this->name; } /** * Returns the MIME content type of a downloaded file. */ public function getContentType(): string { return $this->contentType; } /** * Sends response to output. */ public function send(Nette\Http\IRequest $httpRequest, Nette\Http\IResponse $httpResponse): void { $httpResponse->setContentType($this->contentType); $httpResponse->setHeader( 'Content-Disposition', ($this->forceDownload ? 'attachment' : 'inline') . '; filename="' . $this->name . '"' . '; filename*=utf-8\'\'' . rawurlencode($this->name) ); $filesize = $length = filesize($this->file); $handle = fopen($this->file, 'r'); if (!$handle) { throw new Nette\Application\BadRequestException("Cannot open file: '{$this->file}'."); } if ($this->resuming) { $httpResponse->setHeader('Accept-Ranges', 'bytes'); if (preg_match('#^bytes=(\d*)-(\d*)$#D', (string) $httpRequest->getHeader('Range'), $matches)) { [, $start, $end] = $matches; if ($start === '') { $start = max(0, $filesize - $end); $end = $filesize - 1; } elseif ($end === '' || $end > $filesize - 1) { $end = $filesize - 1; } if ($end < $start) { $httpResponse->setCode(416); // requested range not satisfiable return; } $httpResponse->setCode(206); $httpResponse->setHeader('Content-Range', 'bytes ' . $start . '-' . $end . '/' . $filesize); $length = $end - $start + 1; fseek($handle, (int) $start); } else { $httpResponse->setHeader('Content-Range', 'bytes 0-' . ($filesize - 1) . '/' . $filesize); } } $httpResponse->setHeader('Content-Length', (string) $length); while (!feof($handle) && $length > 0) { echo $s = fread($handle, min(4000000, $length)); $length -= strlen($s); } fclose($handle); } }