projek-xyz/slim-framework

View on GitHub
src/Uploader.php

Summary

Maintainability
A
0 mins
Test Coverage
<?php
namespace Projek\Slim;

use Projek\Slim\Exception\UploadeFileException;
use Psr\Http\Message\UploadedFileInterface;

class Uploader
{
    protected $settings = [
        'directory' => null,
        'extensions' => [],
        'maxSize' => null
    ];

    /**
     * @param  array $settings
     */
    public function __construct(array $settings = [])
    {
        $this->settings = array_merge($this->settings, $settings);

        $this->settings['directory'] || $this->settings['directory'] = directory('storage.uploads');
        $this->settings['maxSize'] || $this->settings['maxSize'] = ini_get('upload_max_filesize');
    }

    /**
     * @param  UploadedFileInterface $file
     */
    public function __invoke(UploadedFileInterface $file)
    {
        if ($file->getError() !== UPLOAD_ERR_OK) {
            throw new UploadeFileException($file->getError());
        }

        if (!in_array($file->getClientMediaType(), $this->settings['extensions'])) {
            throw new \InvalidArgumentException('Filetype not allowed');
        }

        if ($file->getSize() > sizes_to_bites($this->settings['maxSize'])) {
            throw new \InvalidArgumentException('Filesize is too big');
        }

        $this->validateDirectory();

        $this->upload($file);
    }

    protected function validateDirectory()
    {
        /** @var \League\Flysystem\Filesystem $fs */
        $fs = app('filesystem');
        $path = str_replace(directory('storage'), '', $this->settings['directory']);

        if (!$fs->has($path)) {
            $fs->createDir($path);
        }
    }

    /**
     * @param  UploadedFileInterface $file
     */
    protected function upload(UploadedFileInterface $file)
    {
        $file->moveTo($this->settings['directory'].'/'.$file->getClientFilename());
    }
}