JohnCMS | Upload

6.71K
.
Ей 25
# Delphinum (22.08.2016 / 20:23)
Для обработки изображений в последнем своем проекте использовал данный пакет.

В живую это выглядело так:

$this->fileTable->edit($file, function
Вот это крутая штука. Я знаком с этим классом, мне понравился. Все в одном файле и необходимый функционал есть(не знаю почему он избыточен).
.
Delphinum

Мне кажется загрузку файла на сервер у вас можно ограничить одним классом вида:

HTML форма (+/-)
<form method="POST" action="/index.php" enctype="multipart/form-data">
<input type="file" name="first"/>
<input type="file" name="second"/>
<input type="file" name="last"/>
<input type="submit"/>
</form>


Класс (+/-)
class UploadedFile{
  /**
   * @var string Адрес файла.
   */
  private $file;

  /**
   * @var int Размер файла.
   */
  private $size;

  /**
   * @var int Код ошибки.
   */
  private $errorStatus;

  /**
   * @var string Имя файла на машине клиента.
   */
  private $clientFilename;

  /**
   * @var string Mime-тип файла на машине клиента.
   */
  private $clientMediaType;

  public function __construct($file, $size, $errorStatus, $clientFilename = null, $clientMediaType = null){
    $this->file = $file;
    $this->size = $size;
    $this->errorStatus = $errorStatus;
    $this->clientFilename = $clientFilename;
    $this->clientMediaType = $clientMediaType;
  }

  // Factories
  /**
   * @param string $name Имя элемента массива $_FILES, в котором содержится 
   * данные целевого файла.
   * 
   * @return self Загружаемый файл.
   */
  public static function createByGlobal($name){
    $file = $_FILES[$name];
    return new static($file['tmp_name'], $file['size'], $file['error'], $file['name'], $file['type']);
  }

  // Getters and Setters
  public function getFile(){
    return $this->file;
  }

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

  public function getErrorStatus(){
    return $this->errorStatus;
  }

  public function getClientFilename(){
    return $this->clientFilename;
  }

  public function getClientMediaType(){
    return $this->clientMediaType;
  }

  // Other
  /**
   * @param string $targetPath Новый адрес, по которому будет перемещен файл.
   *
   * @throws RuntimeException Выбрасывается в случае ошибки при переносе файла.
   */
  public function moveTo($targetPath){
    if(move_uploaded_file($this->file, $targetPath) === false){
      throw new RuntimeException('Error occurred while moving uploaded file');
    }
    $this->file = $targetPath;
  }
}

$file = UploadedFile::createByGlobal('first');
$file->moveTo('file_storage/' . $file->getClientFilename());
.
(\/)____o_O____(\/)

Delphinum, CP же по сути

.

Koenig, ты про юниксовую команду cp? Ну а вам что надо от загрузчика еще? )

.
(\/)____o_O____(\/)

Delphinum, банальность как по мне, вон Рамзес запилил сторадж

.

Koenig, Так загрузка файла операция банальная.

.
(\/)____o_O____(\/)

Delphinum, ну по сути подобного класса было бы достаточно, но как по мне, пример с картинками, то мне нужна только ссылка на тмп, оттуда я забираю картинку и уже потом сохраняю, а шмон массива файлз , валидация и прочее не должна падать на этот класс как по мне, хотя тоже можно вытащить из него

.
Delphinum

Koenig, ну так ты правильно думаешь. Я привел пример класса, представляющего загружаемый файл. Можно так же реализовать следующие классы:
* Request - запрос пользователя с инфой о загружаемых файлах и не только
* FileStorage - файловое хранилище, завязанное на каталог
* ImageEditor - редактор картинок
* ValidatorIInterface - пачка валидаторов, которая может использоваться как для валидации файлов, так и для других нужд

P.S. это если делать по хорошему с применением ООП. Если слишком сложно, то можно аналогичное реализовать на процедурке, получится не хуже.

.
(\/)____o_O____(\/)

Delphinum, вроде у тебя видел что то подобное с пачкой валидаторов

.
# Koenig (22.08.2016 / 22:57)
Delphinum, банальность как по мне, вон Рамзес запилил сторадж
я пилил отдельно типа роутинга файлов, а аплоад у меня такой же простой как предлагают тут.
пара настроек на проверку размер, миметип, расширение и валидация имени сохранения, больше я даже и придумать то ни чего не смог к аплоаду)) он же по сути прост как 3 копейки, получил, проверил, отдал\сохранил
Всего: 140