Seditio Source
Root |
./othercms/croogo-4.0.7/vendor/croogo/croogo/FileManager/src/Event/LegacyLocalAttachmentStorageHandler.php
<?php

namespace Croogo\FileManager\Event;

use
Cake\Event\Event;
use
Cake\Event\EventListenerInterface;
use
Cake\Log\LogTrait;
use
Croogo\FileManager\Utility\StorageManager;

/**
 * Class LegacyLocalAttachmentStorageHandler
 */
class LegacyLocalAttachmentStorageHandler extends BaseStorageHandler implements EventListenerInterface
{

    use
LogTrait;

   
/**
     * @return array
     */
   
public function implementedEvents()
    {
        return [
           
'FileStorage.beforeSave' => 'onBeforeSave',
           
'FileStorage.beforeDelete' => 'onBeforeDelete',
           
'Assets.AssetsImageHelper.resize' => 'onResizeImage',
        ];
    }

   
/**
     * @param $event
     *
     * @return bool
     */
   
public function onBeforeSave(Event $event)
    {
        if (!
$this->_check($event)) {
            return
true;
        }

       
$model = $event->getSubject();
       
$storage = $event->getData('record');

        if (empty(
$storage->file)) {
            if (isset(
$storage->path) && empty($storage->filename)) {
               
$path = rtrim(WWW_ROOT, '/') . $storage->path;
               
$fp = fopen($path, 'r');
               
$stat = fstat($fp);
               
$imageInfo = $this->__getImageInfo($path);
               
$storage['filesize'] = $stat[7];
               
$storage['filename'] = basename($path);
               
$storage['hash'] = sha1_file($path);
               
$storage['mime_type'] = $imageInfo['mimeType'];
               
$storage['width'] = $imageInfo['width'];
               
$storage['height'] = $imageInfo['height'];
               
$storage['extension'] = substr($path, strrpos($path, '.') + 1);
            }

            return
true;
        }

       
$file = $storage->file;
       
$adapter = StorageManager::adapter($storage->adapter);
        try {
           
$raw = file_get_contents($file['tmp_name']);
           
$extension = substr($file['name'], strrpos($file['name'], '.') + 1);

           
$imageInfo = $this->__getImageInfo($file['tmp_name']);
            if (isset(
$imageInfo['mimeType'])) {
               
$mimeType = $imageInfo['mimeType'];
            } else {
               
$mimeType = $file['type'];
            }

           
$result = $adapter->write($file['name'], $raw);
           
$storage['filename'] = $file['name'];
           
$storage['filesize'] = $file['size'];
           
$storage['hash'] = sha1($raw);
           
$storage['extension'] = $extension;
           
$storage['mime_type'] = $mimeType;
           
$storage['width'] = $imageInfo['width'];
           
$storage['height'] = $imageInfo['height'];
            if (empty(
$storage['path'])) {
               
$storage['path'] = '/uploads/' . $file['name'];
            }

            return
$result;
        } catch (
Exception $e) {
           
$this->log($e->getMessage());

            return
false;
        }
    }

   
/**
     * @param $event
     *
     * @return bool
     */
   
public function onBeforeDelete(Event $event)
    {
        if (!
$this->_check($event)) {
            return
true;
        }
       
$model = $event->getSubject();
       
$entity = $event->getData('record');
       
$fields = ['adapter', 'filename'];
       
$asset = $model->findById($entity->id, $fields)->first();
       
$adapter = StorageManager::adapter($asset['adapter']);
        if (
$adapter->has('filename')) {
           
$adapter->delete($asset->filename);
        }

        return
$model->deleteAll(['parent_asset_id' => $entity->id], true, true);
    }

   
/**
     * @param $attachment
     *
     * @return bool
     */
   
protected function _parentAsset($attachment)
    {
       
$path = $attachment->import_path;
       
$parts = pathinfo($path);
        if (
strpos($parts['filename'], '.') === false) {
           
// old style, no resize indicator, dimension prepended
           
list($size, $filename) = explode('_', $parts['filename'], 2);
        } else {
           
// new style, with resize indicator appended before extension
           
$filename = substr($parts['filename'], 0, strrpos($parts['filename'], '.'));
        }

       
// strip cacheDir if found
       
$dirname = $parts['dirname'];
       
$pos = strpos($parts['dirname'], '/', 1);
        if (
$pos !== false) {
           
$dirname = substr($parts['dirname'], 0, $pos);
        }

       
$filename = rtrim(WWW_ROOT, '/') . $dirname . '/' . $filename . '.' . $parts['extension'];
        if (
file_exists($filename)) {
           
$hash = sha1_file($filename);

            return
$this->Attachments->Assets->findByHash($hash)->first();
        }

        return
false;
    }
}