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

namespace ConcreteFlysystemAdapter;

use 
AwsS3S3Client;
use 
AwsS3EnumGroup;
use 
AwsS3EnumPermission;
use 
ConcreteFlysystemAdapterInterface;
use 
ConcreteFlysystemConfig;
use 
ConcreteFlysystemUtil;

class 
AwsS3 extends AbstractAdapter
{
    
/**
     * @var  array  $resultMap
     */
    
protected static $resultMap = array(
        
'Body'          => 'contents',
        
'ContentLength' => 'size',
        
'ContentType'   => 'mimetype',
        
'Size'          => 'size',
    );

    
/**
     * @var  array  $metaOptions
     */
    
protected static $metaOptions = array(
        
'Cache-Control',
        
'Expires',
    );

    
/**
     * @var  string  $bucket  bucket name
     */
    
protected $bucket;

    
/**
     * @var  AwsS3S3Client  $client  S3 Client
     */
    
protected $client;

    
/**
     * @var  string  $prefix  path prefix
     */
    
protected $prefix;

    
/**
     * @var  array  $options  default options
     */
    
protected $options = array();

    
/**
     * Constructor
     *
     * @param  S3Client  $client
     * @param  string    $bucket
     * @param  string    $prefix
     * @param  array     $options
     */
    
public function __construct(S3Client $client$bucket$prefix null, array $options = array())
    {
        
$this->client $client;
        
$this->bucket $bucket;
        
$this->prefix $prefix;
        
$this->options $options;
    }

    
/**
     * Check whether a file exists
     *
     * @param   string  $path
     * @return  bool    weather an object result
     */
    
public function has($path)
    {
        return 
$this->client->doesObjectExist($this->bucket$this->prefix($path));
    }

    
/**
     * Write a file
     *
     * @param   string  $path
     * @param   string  $contents
     * @param   mixed   $config
     * @return  array   file metadata
     */
    
public function write($path$contents$config null)
    {
        
$config Util::ensureConfig($config);
        
$options $this->getOptions($path, array(
            
'Body' => $contents,
            
'ContentType' => Util::guessMimeType($path$contents),
            
'ContentLength' => Util::contentSize($contents),
        ), 
$config);

        
$result $this->client->putObject($options);

        if (
$result === false) {
            return 
false;
        }

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

    
/**
     * Write using a stream
     *
     * @param   string    $path
     * @param   resource  $resource
     * @param   mixed     $config
     *
     * @return  array     file metadata
     */
    
public function writeStream($path$resource$config null)
    {
        
$config Util::ensureConfig($config);
        
$options $this->getOptions($path, array(
            
'Body' => $resource,
        ), 
$config);

        
$this->client->putObject($options);

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

    
/**
     * Update a file
     *
     * @param   string  $path
     * @param   string  $contents
     * @param   mixed   $config   Config object or visibility setting
     * @return  array   file metadata
     */
    
public function update($path$contents$config null)
    {
        return 
$this->write($path$contents$config);
    }

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

    
/**
     * Read a file
     *
     * @param   string  $path
     * @return  array   file metadata
     */
    
public function read($path)
    {
        
$options $this->getOptions($path);
        
$result $this->client->getObject($options);

        return 
$this->normalizeObject($result->getAll(), $path);
    }

    
/**
     * Get a read-stream for a file
     *
     * @param   string  $path
     * @return  array   file metadata
     */
    
public function readStream($path)
    {
        if ( ! 
in_array('s3'stream_get_wrappers())) {
            
$this->client->registerStreamWrapper();
        }

        
$context stream_context_create(array(
            
's3' => array('seekable' => true),
        ));

        
$stream fopen('s3://'.$this->bucket.'/'.$this->prefix($path), 'r'false$context);

        return 
compact('stream');
    }

    
/**
     * Rename a file
     *
     * @param   string  $path
     * @param   string  $newpath
     * @return  array   file metadata
     */
    
public function rename($path$newpath)
    {
        
$options $this->getOptions($newpath, array(
            
'Bucket' => $this->bucket,
            
'CopySource' => $this->bucket.'/'.$this->prefix($path),
        ));

        
$result $this->client->copyObject($options)->getAll();
        
$result $this->normalizeObject($result$newpath);
        
$this->delete($path);

        return 
$result;
    }

    
/**
     * Copy a file
     *
     * @param   string  $path
     * @param   string  $newpath
     * @return  array   file metadata
     */
    
public function copy($path$newpath)
    {
        
$options $this->getOptions($newpath, array(
            
'Bucket' => $this->bucket,
            
'CopySource' => $this->bucket.'/'.$this->prefix($path),
        ));

        
$result $this->client->copyObject($options)->getAll();

        return 
$this->normalizeObject($result$newpath);
    }

    
/**
     * Delete a file
     *
     * @param   string   $path
     * @return  boolean  delete result
     */
    
public function delete($path)
    {
        
$options $this->getOptions($path);

        return 
$this->client->deleteObject($options);
    }

    
/**
     * Delete a directory (recursive)
     *
     * @param   string   $path
     * @return  boolean  delete result
     */
    
public function deleteDir($path)
    {
        
$prefix rtrim($this->prefix($path), '/') . '/';

        return 
$this->client->deleteMatchingObjects($this->bucket$prefix);
    }

    
/**
     * Create a directory
     *
     * @param   string  $path
     * @return  array   directory metadata
     */
    
public function createDir($path)
    {
        
$result $this->write(rtrim($path'/') . '/''');

        if ( ! 
$result) {
            return 
false;
        }

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

    
/**
     * Get metadata for a file
     *
     * @param   string  $path
     * @return  array   file metadata
     */
    
public function getMetadata($path)
    {
        
$options $this->getOptions($path);
        
$result $this->client->headObject($options);

        return 
$this->normalizeObject($result->getAll(), $path);
    }

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

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

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

    
/**
     * Get the visibility of a file
     *
     * @param   string  $path
     * @return  array   file metadata
     */
    
public function getVisibility($path)
    {
        
$options $this->getOptions($path);
        
$result $this->client->getObjectAcl($options)->getAll();
        
$visibility AdapterInterface::VISIBILITY_PRIVATE;

        foreach (
$result['Grants'] as $grant) {
            if (isset(
$grant['Grantee']['URI']) && $grant['Grantee']['URI'] === Group::ALL_USERS && $grant['Permission'] === Permission::READ) {
                
$visibility AdapterInterface::VISIBILITY_PUBLIC;
                break;
            }
        }

        return 
compact('visibility');
    }

    
/**
     * Get mimetype of a file
     *
     * @param   string  $path
     * @param   string  $visibility
     * @return  array   file metadata
     */
    
public function setVisibility($path$visibility)
    {
        
$options $this->getOptions($path, array(
            
'ACL' => $visibility === AdapterInterface::VISIBILITY_PUBLIC 'public-read' 'private',
        ));

        
$this->client->putObjectAcl($options);

        return 
compact('visibility');
    }

    
/**
     * List contents of a directory
     *
     * @param   string  $dirname
     * @param   bool    $recursive
     * @return  array   directory contents
     */
    
public function listContents($dirname ''$recursive false)
    {
        
$objectsIterator $this->client->getIterator('listObjects', array(
            
'Bucket' => $this->bucket,
            
'Prefix' => $this->prefix($dirname),
        ));

        
$contents iterator_to_array($objectsIterator);
        
$result array_map(array($this'normalizeObject'), $contents);

        return 
Util::emulateDirectories($result);
    }

    
/**
     * Normalize a result from AWS
     *
     * @param   string  $object
     * @param   string  $path
     * @return  array   file metadata
     */
    
protected function normalizeObject($object$path null)
    {
        
$result = array('path' => $path ?: $object['Key']);

        if (isset(
$object['LastModified'])) {
            
$result['timestamp'] = strtotime($object['LastModified']);
        }

        if (
substr($result['path'], -1) === '/') {
            
$result['type'] = 'dir';
            
$result['path'] = rtrim($result['path'], '/');
            
$result['dirname'] = Util::dirname($result['path']);

            return 
$result;
        }

        
$result array_merge($resultUtil::map($object, static::$resultMap), array('type' => 'file'));
        
$result['dirname'] = Util::dirname($result['path']);

        if (isset(
$result['contents'])) {
            
$result['contents'] = (string) $result['contents'];
        }

        return 
$result;
    }

    
/**
     * Get options for a AWS call
     *
     * @param   string  $path
     * @param   array   $options
     *
     * @return  array   AWS options
     */
    
protected function getOptions($path, array $options = array(), Config $config null)
    {
        
$options['Key'] = $this->prefix($path);
        
$options['Bucket'] = $this->bucket;

        if (
$config) {
            
$options array_merge($options$this->getOptionsFromConfig($config));
        }

        return 
array_merge($this->options$options);
    }

    
/**
     * Retrieve options from a Config instance
     *
     * @param   Config  $config
     * @return  array
     */
    
protected function getOptionsFromConfig(Config $config)
    {
        
$options = array();

        foreach (static::
$metaOptions as $option) {
            if ( ! 
$config->has($option)) continue;
            
$options[$option] = $config->get($option);
        }

        if (
$visibility $config->get('visibility')) {
            
// For local reference
            
$options['visibility'] = $visibility;
            
// For external reference
            
$options['ACL'] = $visibility === AdapterInterface::VISIBILITY_PUBLIC 'public-read' 'private';
        }

        if (
$mimetype $config->get('mimetype')) {
            
// For local reference
            
$options['mimetype'] = $mimetype;
            
// For external reference
            
$options['ContentType'] = $mimetype;
        }

        return 
$options;
    }

    
/**
     * Prefix a path
     *
     * @param   string  $path
     * @return  string  prefixed path
     */
    
protected function prefix($path)
    {
        if (! 
$this->prefix) {
            return 
$path;
        }

        return 
$this->prefix.'/'.$path;
    }
}
Онлайн: 3
Реклама