JohnCMS | Upload

3.8K
.
# Delphinum (22.08.2016 / 23:32)
Ну тем более если не важно ООП и сложность, делайте просто с помощью какого нить "Божественного класса", который будет за все это отвечать.
его будет трудно модифицировать, и убирать, в случае критических конфликтов класса и движка же
тут уже есть один такой "божественный" класс, этот самый, пресловутый, аплоад
.
(\/)____o_O____(\/)
# ramzes (22.08.2016 / 23:14)
че то посмотрел немножко, уже хочется к своему пару идей добавить заимствованных оттуда)
интересная штука
тоже рассматривал когда то этот класс, он у меня на локале года три уже валяется Гг
.
(\/)____o_O____(\/)
тот простой класс который когда то предлагал
https://github.com/aivis/PHP-f ... class
.
ramzes, ну в "научных кругах" такой контролёр описывается "Фасадом", который создается над пачкой файлов и предоставляет единый интерфейс работы с хранилищем.

К примеру что то такое:
<?php
class FileStorageFacade{
  /**
   * @var string Адрес каталога хранилища.
   */
  private $dir;

  /**
   * @var Validator[] Валидаторы, применяемые к загружаемым файлам.
   */
  private $validators;

  /**
   * @var FileEditor Редакторы файлов.
   */
  private $editors;

  /**
   * @param string $dir Адрес каталога хранилища.
   */
  public function __construct($dir){
    $this->dir = $dir;
    $this->validators = [];
    $this->editors = [];
  }

  // Getters and Setters
  public function addValidator($validator){
    $this->validators[] = $validator;
  }

  public function addEditor($editor){
    $this->editors[] = $editor;
  }

  /**
   * @param string $file Адрес перемещаемого в хранилище файла.
   *
   * @return string Идентификатор перемещенного файла.
   */
  public function moveIn($file){
    if(!file_exists($file)){
      throw new RuntimeException('Target file not found');
    }
    // Проверка добавляемого файла.
    foreach($this->validators as $validator){
      if(!$validator->isValid($file)){
        throw new RuntimeException('Invalid file');
      }
    }

    $id = $this->generateId();
    rename($file, $this->dir . '/' . $id);
    // Тут лучше еще записать инфу о файле в базу.

    // Изменение добавленного файла.
    foreach($this->editors as $editor){
      $editor->edit($file);
    }

    return $id;
  }

  /**
   * @param UploadedFile $file Загружаемый в хранилище файл.
   */
  public function uploadIn(UploadedFile $file){
    $this->moveIn($file->getFile());
  }

  /**
   * @param string $id Идентификатор целевого файла.
   *
   * @return string Адрес файла в хранилище.
   */
  public function at($id){
    $path = $this->dir . '/' . $id;
    if(!file_exists($path)){
      return null;
    }

    return $path;
  }

  // Other
  /**
   * @return string Новый идентификатор в хранилище.
   */
  protected function generateId(){
    return (string) rand(1000, 9999); // Конечно нужно что то посерьезнее
  }
}
?>
.
AlkatraZ, если таки применяется весь Zend, то у него на борту все есть ) Да, остается только фасады понаписать к нему.
.
╭∩╮ (`-`) ╭∩╮
# Delphinum (22.08.2016 / 23:56)
AlkatraZ, если таки применяется весь Zend, то у него на борту все есть )
Нет, не весь, а отдельные пакеты, те, что нужны.
.
AlkatraZ, подтяните тогда уж зендовый diactoros, в нем есть реализация UploadedFile согласно PSR7
.
╭∩╮ (`-`) ╭∩╮
# Delphinum (23.08.2016 / 00:03)
AlkatraZ, подтяните тогда уж зендовый diactoros, в нем есть реализация UploadedFile согласно PSR7
Это давно запилено в mobiCMS, а в Джоне этого не будет, нет смысла.
.
Delphinum, если хранить в бд то придется каждый старт вычитывать таблицу, а файлов могут быть многие тысячи
мне показалось это черезмерно напряжным, была мысль сделать альтернативную функцию генерации имени_сохранения на основе пути к файлу или его мд5хешу (появится возможность проверки дублирования файла на основе хеша).
но мысль привлекательная в целом
.
ramzes, если нужна ранняя оптимизация, используйте кеши.
Всего: 140