Вход Регистрация
Файл: concrete5.7.5.6/concrete/vendor/concrete5/flysystem/src/Adapter/Local.php
Строк: 321
<?php

namespace ConcreteFlysystemAdapter;

use 
SplFileInfo;
use 
FilesystemIterator;
use 
DirectoryIterator;
use 
RecursiveDirectoryIterator;
use 
RecursiveIteratorIterator;
use 
ConcreteFlysystemUtil;
use 
ConcreteFlysystemAdapterInterface;

class 
Local extends AbstractAdapter
{
    protected static 
$permissions = array(
        
'public' => 0744,
        
'private' => 0700,
    );

    protected 
$root;

    
/**
     * Constructor
     *
     * @param  string  $root
     */
    
public function __construct($root)
    {
        
$root $this->ensureDirectory($root);
        
$this->root Util::normalizePrefix($rootDIRECTORY_SEPARATOR);
    }

    
/**
     * Ensure the root directory exists.
     *
     * @param   string  $root  root directory path
     * @return  string  real path to root
     */
    
protected function ensureDirectory($root)
    {
        if ( ! 
is_dir($root)) {
            
mkdir($root0755true);
        }

        return 
realpath($root);
    }

    
/**
     * Prefix a path with the root
     *
     * @param   string  $path
     * @return  string  prefixed path
     */
    
public function prefix($path)
    {
        if (
$path === '') {
            return 
$this->root;
        }

        
$path str_replace('/'DIRECTORY_SEPARATOR$path);

        return 
$this->root.Util::normalizePath($pathDIRECTORY_SEPARATOR);
    }

    
/**
     * Check whether a file is present
     *
     * @param   string   $path
     * @return  boolean
     */
    
public function has($path)
    {
        
$location $this->prefix($path);

        return 
file_exists($location);
    }

    
/**
     * Write a file
     *
     * @param $path
     * @param $contents
     * @param null $config
     * @return array|bool
     */
    
public function write($path$contents$config null)
    {
        
$location $this->prefix($path);
        
$config Util::ensureConfig($config);
        
$this->ensureDirectory(dirname($location));

        if ((
$size file_put_contents($location$contentsLOCK_EX)) === false) {
            return 
false;
        }

        
$type 'file';
        
$result compact('contents''type''size''path');

        if (
$visibility $config->get('visibility')) {
            
$result['visibility'] = $visibility;
            
$this->setVisibility($path$visibility);
        }

        return 
$result;
    }

    
/**
     * Write using a stream
     *
     * @param $path
     * @param $resource
     * @param null $config
     * @return array|bool
     */
    
public function writeStream($path$resource$config null)
    {
        
rewind($resource);
        
$config Util::ensureConfig($config);
        
$location $this->prefix($path);
        
$this->ensureDirectory(dirname($location));

        if ( ! 
$stream fopen($location'w+')) {
            return 
false;
        }

        while ( ! 
feof($resource)) {
            
fwrite($streamfread($resource1024), 1024);
        }

        if ( ! 
fclose($stream)) {
            return 
false;
        }

        if (
$visibility $config->get('visibility')) {
            
$this->setVisibility($path$visibility);
        }

        return 
compact('path''visibility');
    }

    
/**
     * Get a read-stream for a file
     *
     * @param $path
     * @return array|bool
     */
    
public function readStream($path)
    {
        
$stream fopen($this->prefix($path), 'r');

        return 
compact('stream''path');
    }

    
/**
     * Update a file using a stream
     *
     * @param   string    $path
     * @param   resource  $resource
     * @param   mixed     $config   Config object or visibility setting
     * @return  array|bool
     */
    
public function updateStream($path$resource$config null)
    {
        return 
$this->writeStream($path$resource$config);
    }

    
/**
     * Update a file
     *
     * @param   string       $path
     * @param   string       $contents
     * @param   mixed        $config   Config object or visibility setting
     * @return  array|bool
     */
    
public function update($path$contents$config null)
    {
        
$location $this->prefix($path);
        
$mimetype Util::guessMimeType($path$contents);

        if ((
$size file_put_contents($location$contentsLOCK_EX)) === false) {
            return 
false;
        }

        return 
compact('path''size''contents''mimetype');
    }

    
/**
     * Read a file
     *
     * @param   string  $path
     * @return  array|bool
     */
    
public function read($path)
    {
        if ((
$contents file_get_contents($this->prefix($path))) === false) {
            return 
false;
        }

        return 
compact('contents''path');
    }

    
/**
     * Rename a file
     *
     * @param $path
     * @param $newpath
     * @return bool
     */
    
public function rename($path$newpath)
    {
        
$location $this->prefix($path);
        
$destination $this->prefix($newpath);

        return 
rename($location$destination);
    }

    
/**
     * Copy a file
     *
     * @param $path
     * @param $newpath
     * @return bool
     */
    
public function copy($path$newpath)
    {
        
$location $this->prefix($path);
        
$destination $this->prefix($newpath);

        return 
copy($location$destination);
    }

    
/**
     * Delete a file
     *
     * @param $path
     * @return bool
     */
    
public function delete($path)
    {
        return 
unlink($this->prefix($path));
    }

    
/**
     * List contents of a directory
     *
     * @param string $directory
     * @param bool $recursive
     * @return array
     */
    
public function listContents($directory ''$recursive false)
    {
        return 
$this->directoryContents($directory$recursive);
    }

    
/**
     * Get the metadata of a file
     *
     * @param $path
     * @return array
     */
    
public function getMetadata($path)
    {
        
$location $this->prefix($path);
        
$info = new SplFileInfo($location);

        return 
$this->normalizeFileInfo($path$info);
    }

    
/**
     * Get the size of a file
     *
     * @param $path
     * @return array
     */
    
public function getSize($path)
    {
        return 
$this->getMetadata($path);
    }

    
/**
     * Get the mimetype of a file
     *
     * @param $path
     * @return array
     */
    
public function getMimetype($path)
    {
        
$location $this->prefix($path);

        
$mime_type UtilMimeType::detectMimeType($location);

        return array(
'mimetype' => $mime_type);
    }

    
/**
     * Get the timestamp of a file
     *
     * @param $path
     * @return array
     */
    
public function getTimestamp($path)
    {
        return 
$this->getMetadata($path);
    }

    
/**
     * Get the visibility of a file
     *
     * @param $path
     * @return array|void
     */
    
public function getVisibility($path)
    {
        
$location $this->prefix($path);
        
clearstatcache(false$location);
        
$permissions octdec(substr(sprintf('%o'fileperms($location)), -4));
        
$visibility $permissions 0044 AdapterInterface::VISIBILITY_PUBLIC AdapterInterface::VISIBILITY_PRIVATE;

        return 
compact('visibility');
    }

    
/**
     * Set the visibility of a file
     *
     * @param $path
     * @param $visibility
     * @return array|void
     */
    
public function setVisibility($path$visibility)
    {
        
$location $this->prefix($path);
        
chmod($location, static::$permissions[$visibility]);

        return 
compact('visibility');
    }

    
/**
     * Create a directory
     *
     * @param $dirname
     * @return array
     */
    
public function createDir($dirname)
    {
        
$location $this->prefix($dirname);

        if ( ! 
is_dir($location)) {
            
mkdir($location0777true);
        }

        return array(
'path' => $dirname'type' => 'dir');
    }

    
/**
     * Delete a directory
     *
     * @param $dirname
     * @return bool
     */
    
public function deleteDir($dirname)
    {
        
$location $this->prefix($dirname);

        if ( ! 
is_dir($location)) {
            return 
false;
        }

        
$contents $this->directoryContents($dirnametrue);
        
$contents array_reverse($contents);

        foreach (
$contents as $file) {
            if (
$file['type'] === 'file') {
                
unlink($this->prefix($file['path']));
            } else {
                
rmdir($this->prefix($file['path']));
            }
        }

        return 
rmdir($location);
    }

    
/**
     * Get contents of a directory
     *
     * @param string $path
     * @param bool $recursive
     * @return array
     */
    
protected function directoryContents($path ''$recursive false)
    {
        
$result = array();
        
$location $this->prefix($path).DIRECTORY_SEPARATOR;

        if ( ! 
is_dir($location)) {
            return array();
        }

        
$length strlen($this->root);
        
$iterator $recursive $this->getRecursiveDirectoryIterator($location) : $this->getDirectoryIterator($location);

        foreach (
$iterator as $file) {
            
$path substr($file->getPathname(), $length);
            
$path trim($path'\/');
            if (
preg_match('#(^|/).{1,2}$#'$path)) continue;
            
$result[] = $this->normalizeFileInfo($path$file);
        }

        return 
$result;
    }

    
/**
     * Normalize the file info
     *
     * @param $path
     * @param SplFileInfo $file
     * @return array
     */
    
protected function normalizeFileInfo($pathSplFileInfo $file)
    {
        
$normalized = array('type' => $file->getType(), 'path' => $path);

        if (
$normalized['type'] === 'file') {
            
$normalized['timestamp'] = $file->getMTime();
            
$normalized['size'] = $file->getSize();
        }

        return 
$normalized;
    }

    
/**
     * @param $path
     * @return RecursiveIteratorIterator
     */
    
protected function getRecursiveDirectoryIterator($path)
    {
        
$directory = new RecursiveDirectoryIterator($pathFilesystemIterator::SKIP_DOTS);
        
$iterator = new RecursiveIteratorIterator($directoryRecursiveIteratorIterator::SELF_FIRST);

        return 
$iterator;
    }

    
/**
     * @param $path
     * @return DirectoryIterator
     */
    
protected function getDirectoryIterator($path)
    {
        
$iterator = new DirectoryIterator($path);

        return 
$iterator;
    }
}
Онлайн: 3
Реклама