From c2109e176017797c6b8494587a452e9d23f3897e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mr=C2=B7x?= Date: Thu, 12 Aug 2021 15:19:51 +0800 Subject: [PATCH] =?UTF-8?q?=E6=94=B9=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Server/Constrict/DownloadEmitter.php | 81 ++++++++++++++++++++++++++++ Server/Constrict/Request.php | 4 -- Server/Constrict/ResponseEmitter.php | 70 ++---------------------- 3 files changed, 84 insertions(+), 71 deletions(-) create mode 100644 Server/Constrict/DownloadEmitter.php diff --git a/Server/Constrict/DownloadEmitter.php b/Server/Constrict/DownloadEmitter.php new file mode 100644 index 00000000..50af9c82 --- /dev/null +++ b/Server/Constrict/DownloadEmitter.php @@ -0,0 +1,81 @@ + 'image/png', + 'jpeg' => 'image/jpeg', + 'gif' => 'image/gif', + 'bmp' => 'image/bmp', + 'ico' => 'image/vnd.microsoft.icon', + 'tiff' => 'image/tiff', + 'svg' => 'image/svg+xml', + ]; + + + /** + * @param mixed $response + * @param ResponseInterface $emitter + * @throws NotFindClassException + * @throws ReflectionException + */ + public function sender(mixed $response, ResponseInterface $emitter): void + { + $content = $emitter->getContent(); + + $explode = explode('/', $content['path']); + + $response->header('Pragma', 'public'); + $response->header('Expires', '0'); + $response->header('Cache-Control', 'must-revalidate, post-check=0, pre-check=0'); + $response->header('Content-Disposition', 'attachment;filename=' . end($explode)); + $response->header('Content-Type', $type = get_file_extension($content['path'])); + if (!in_array($type, self::IMAGES)) { + $response->header('Content-Transfer-Encoding', 'binary'); + } else { + $response->end(file_get_contents($content['path'])); + return; + } + if ($content['isChunk'] === false) { + $response->sendfile($content['path']); + } else { + $this->chunk($content, $response); + } + } + + + /** + * @param $content + * @param $response + */ + private function chunk($content, $response): void + { + $resource = fopen($content['path'], 'r'); + + $state = fstat($resource); + + $offset = $content['offset']; + + $response->header('Content-length', $state['size']); + while ($file = fread($resource, $content['limit'])) { + $response->write($file); + fseek($resource, $offset); + if ($offset >= $state['size']) { + break; + } + $offset += $content['limit']; + } + $response->end(); + } +} diff --git a/Server/Constrict/Request.php b/Server/Constrict/Request.php index 8108ce36..248f695b 100644 --- a/Server/Constrict/Request.php +++ b/Server/Constrict/Request.php @@ -3,13 +3,10 @@ namespace Server\Constrict; use HttpServer\Http\Context; -use HttpServer\Http\HttpHeaders; -use HttpServer\Http\HttpParams; use HttpServer\Http\Request as HttpResponse; use HttpServer\Http\Response; use ReflectionException; use Server\RequestInterface; -use Kiri\Abstracts\BaseObject; use Kiri\Exception\NotFindClassException; use Kiri\Kiri; @@ -71,7 +68,6 @@ class Request implements RequestInterface Context::setContext(HttpResponse::class, $sRequest); - return Kiri::getDi()->get(Request::class); } } diff --git a/Server/Constrict/ResponseEmitter.php b/Server/Constrict/ResponseEmitter.php index 18445b32..f24986b3 100644 --- a/Server/Constrict/ResponseEmitter.php +++ b/Server/Constrict/ResponseEmitter.php @@ -4,7 +4,6 @@ namespace Server\Constrict; use Exception; use HttpServer\Http\Formatter\FileFormatter; -use HttpServer\IInterface\IFormatter; use Kiri\Exception\NotFindClassException; use ReflectionException; use Server\ResponseInterface; @@ -29,74 +28,11 @@ class ResponseEmitter implements Emitter { $content = $emitter->configure($response)->getContent(); if ($content instanceof FileFormatter) { - $this->download($content->getData(), $response); - } else { - $response->header('Content-Type', $emitter->getResponseFormat()); - $response->end($content->getData()); - } - } - - const IMAGES = [ - 'png' => 'image/png', - 'jpeg' => 'image/jpeg', - 'gif' => 'image/gif', - 'bmp' => 'image/bmp', - 'ico' => 'image/vnd.microsoft.icon', - 'tiff' => 'image/tiff', - 'svg' => 'image/svg+xml', - ]; - - - /** - * @param array $content - * @param \Swoole\Http\Response $response - */ - private function download(array $content, \Swoole\Http\Response $response) - { - $explode = explode('/', $content['path']); - - $response->header('Pragma', 'public'); - $response->header('Expires', '0'); - $response->header('Cache-Control', 'must-revalidate, post-check=0, pre-check=0'); - $response->header('Content-Disposition', 'attachment;filename=' . end($explode)); - $response->header('Content-Type', $type = get_file_extension($content['path'])); - if (!in_array($type, self::IMAGES)) { - $response->header('Content-Transfer-Encoding', 'binary'); - } else { - $response->end(file_get_contents($content['path'])); + di(DownloadEmitter::class)->sender($response, $emitter); return; } - if ($content['isChunk'] === false) { - $response->sendfile($content['path']); - } else { - $this->chunk($content, $response); - } + $response->header('Content-Type', $emitter->getResponseFormat()); + $response->end($content->getData()); } - - /** - * @param $content - * @param $response - */ - private function chunk($content, $response): void - { - $resource = fopen($content['path'], 'r'); - - $state = fstat($resource); - - $offset = $content['offset']; - - $response->header('Content-length', $state['size']); - while ($file = fread($resource, $content['limit'])) { - $response->write($file); - fseek($resource, $offset); - if ($offset >= $state['size']) { - break; - } - $offset += $content['limit']; - } - $response->end(); - } - - }