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

namespace ConcreteFlysystemAdapter;

use 
LogicException;
use 
ZipArchive;
use 
ConcreteFlysystemUtil;

class 
Zip extends AbstractAdapter
{
    protected static 
$resultMap = array(
        
'size'  => 'size',
        
'mtime' => 'timestamp',
        
'name'  => 'path',
    );

    protected 
$archive;

    public function 
__construct($locationZipArchive $archive null)
    {
        
$this->setArchive($archive ?: new ZipArchive);
        
$this->openArchive($location);
    }

    protected function 
reopenArchive()
    {
        
$path $this->archive->filename;
        
$this->archive->close();
        
$this->openArchive($path);
    }

    public function 
setArchive(ZipArchive $archive)
    {
        
$this->archive $archive;
    }

    public function 
getArchive()
    {
        return 
$this->archive;
    }

    public function 
openArchive($location)
    {
        
$location str_replace('/'DIRECTORY_SEPARATOR$location);

        if ((
$response $this->archive->open($locationZipArchive::CREATE)) !== true) {
            throw new 
LogicException('Could not open zip archive at:'.$location.', error: '.$response);
        }
    }

    public function 
write($path$contents$config null)
    {
        
$dirname Util::dirname($path);
        
$config Util::ensureConfig($config);

        if ( ! empty(
$dirname) && ! $this->has($dirname)) {
            
$this->createDir($dirname);
        }

        if ( ! 
$this->archive->addFromString($path$contents)) {
            return 
false;
        }

        
$result compact('path''contents');

        if (
$config && $config->get('visibility')) {
            throw new 
LogicException(get_class($this).' does not support visibility settings.');
        }

        return 
$result;
    }

    public function 
update($path$contents$config null)
    {
        
$this->delete($path);

        return 
$this->write($path$contents$config);
    }

    public function 
rename($path$newpath)
    {
        return 
$this->archive->renameName($path$newpath);
    }

    public function 
delete($path)
    {
        return 
$this->archive->deleteName($path);
    }

    public function 
deleteDir($dirname)
    {
        
$path Util::normalizePrefix($dirname'/');
        
$length strlen($path);

        for (
$i 0$i $this->archive->numFiles$i++) {
            
$info $this->archive->statIndex($i);

            if (
substr($info['name'], 0$length) === $path) {
                
$this->archive->deleteIndex($i);
            }
        }

        return 
$this->archive->deleteName($dirname);
    }

    public function 
createDir($dirname)
    {
        if ( ! 
$this->has($dirname)) {
            
$this->archive->addEmptyDir($dirname);
        }

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

    public function 
has($path)
    {
        return 
$this->getMetadata($path);
    }

    public function 
read($path)
    {
        
$this->reopenArchive();

        if ( ! 
$contents $this->archive->getFromName($path)) {
            return 
false;
        }

        return 
compact('contents');
    }

    public function 
readStream($path)
    {
        
$this->reopenArchive();

        if ( ! 
$stream $this->archive->getStream($path)) {
            return 
false;
        }

        return 
compact('stream');
    }

    public function 
listContents($dirname ''$recursive false)
    {
        
$result = array();

        
// This is needed to ensure the right number of
        // files are set to the $numFiles property.
        
$this->reopenArchive();

        for (
$i 0$i $this->archive->numFiles$i++) {
            if (
$info $this->archive->statIndex($i)) {
                
$result[] = $this->normalizeObject($info);
            }
        }

        return 
$result;
    }

    public function 
getMetadata($path)
    {
        if ( ! 
$info $this->archive->statName($path)) {
            return 
false;
        }

        return 
$this->normalizeObject($info);
    }

    protected function 
normalizeObject(array $object)
    {
        if (
substr($object['name'], -1) === '/') {
            return array(
                
'path' => trim($object['name'], '/'),
                
'type' => 'dir'
            
);
        }

        
$result = array('type' => 'file');

        return 
array_merge($resultUtil::map($object, static::$resultMap));
    }

    public function 
getSize($path)
    {
        return 
$this->getMetadata($path);
    }

    public function 
getMimetype($path)
    {
        if ( ! 
$data $this->read($path)) {
            return 
false;
        }

        
$data['mimetype'] = Util::guessMimeType($path$data['contents']);

        return 
$data;
    }

    public function 
getTimestamp($path)
    {
        return 
$this->getMetadata($path);
    }
}
Онлайн: 3
Реклама