예제 #1
0
 /**
  * Setup for display or download the given file.
  *
  * If $_SERVER['HTTP_RANGE'] is set a slice of the file will be
  * returned instead of the entire file.
  *
  * ### Options keys
  *
  * - name: Alternate download name
  * - download: If `true` sets download header and forces file to be downloaded rather than displayed in browser
  *
  * @param string $path Path to file. If the path is not an absolute path that resolves
  *   to a file, `APP` will be prepended to the path.
  * @param array $options Options See above.
  * @return void
  * @throws \Cake\Error\NotFoundException
  */
 public function file($path, array $options = array())
 {
     $options += array('name' => null, 'download' => null);
     if (strpos($path, '..') !== false) {
         throw new Error\NotFoundException(__d('cake_dev', 'The requested file contains `..` and will not be read.'));
     }
     if (!is_file($path)) {
         $path = APP . $path;
     }
     $file = new File($path);
     if (!$file->exists() || !$file->readable()) {
         if (Configure::read('debug')) {
             throw new Error\NotFoundException(sprintf('The requested file %s was not found or not readable', $path));
         }
         throw new Error\NotFoundException(__d('cake', 'The requested file was not found'));
     }
     $extension = strtolower($file->ext());
     $download = $options['download'];
     if ((!$extension || $this->type($extension) === false) && $download === null) {
         $download = true;
     }
     $fileSize = $file->size();
     if ($download) {
         $agent = env('HTTP_USER_AGENT');
         if (preg_match('%Opera(/| )([0-9].[0-9]{1,2})%', $agent)) {
             $contentType = 'application/octet-stream';
         } elseif (preg_match('/MSIE ([0-9].[0-9]{1,2})/', $agent)) {
             $contentType = 'application/force-download';
         }
         if (!empty($contentType)) {
             $this->type($contentType);
         }
         if ($options['name'] === null) {
             $name = $file->name;
         } else {
             $name = $options['name'];
         }
         $this->download($name);
         $this->header('Accept-Ranges', 'bytes');
         $this->header('Content-Transfer-Encoding', 'binary');
         $httpRange = env('HTTP_RANGE');
         if (isset($httpRange)) {
             $this->_fileRange($file, $httpRange);
         } else {
             $this->header('Content-Length', $fileSize);
         }
     } else {
         $this->header('Content-Length', $fileSize);
     }
     $this->_clearBuffer();
     $this->_file = $file;
 }
예제 #2
0
 /**
  * testReadable method
  *
  * @return void
  */
 public function testReadable()
 {
     $someFile = new File(TMP . 'some_file.txt', false);
     $this->assertTrue($someFile->open());
     $this->assertTrue($someFile->readable());
     $someFile->close();
     $someFile->delete();
 }