Ejemplo n.º 1
0
 /**
  * Download resource files by browser.
  *
  * @return \Arbor\Provider\Response
  * @since 0.1.0
  */
 public function download()
 {
     $request = $this->getRequest();
     $extra = $request->getExtra();
     $file = substr($request->getRoute(), 1);
     if ($extra[0]['path'] && preg_match('/^' . $extra[0]['pattern'] . '$/', $request->getRoute(), $groups)) {
         $file = substr($extra[0]['path'], 1);
         for ($i = 1; $i < count($groups); $i++) {
             $file = str_replace('{' . $i . '}', $groups[$i], substr($extra[0]['path'], 1));
         }
     }
     $response = new Response();
     if (!is_readable($file)) {
         //nie znajduje pliku
         $response->setStatusCode(404);
     } else {
         $extension = substr(strrchr($file, "."), 1);
         $contentType = "application/" . $extension;
         switch ($extension) {
             case 'css':
             case 'html':
                 $contentType = 'text/' . $extension;
                 break;
             case 'js':
                 $contentType = 'text/javascript';
                 break;
             case 'flv':
                 $contentType = 'video/x-flv';
                 break;
             case 'mp4':
                 $contentType = 'video/mp4';
                 break;
             case 'jpg':
             case 'png':
             case 'gif':
                 $contentType = 'image/' . $extension;
                 break;
         }
         $fileSize = filesize($file);
         $expire = $this->getExpire($request->getExtra());
         $fileTimeModified = filemtime($file);
         $response->setHeader('content-type', $contentType);
         $response->setHeader('content-length', $fileSize);
         if ($expire) {
             $response->setExpire($expire);
         } else {
             $response->setHeader('Last-Modified', gmdate("D, d M Y H:i:s", $fileTimeModified) . " GMT");
         }
         $notModified = false;
         try {
             if (strtotime($request->getHeader('If-Modified-Since')) == $fileTimeModified) {
                 $notModified = true;
                 $response->setStatusCode(304);
             }
         } catch (HeaderNotFoundException $e) {
             //ignore
         }
         $this->rangeSupport($response, $fileSize);
         $response->setContent($file);
     }
     return $response;
 }