Загрузка файлов

Содержание...

Cистемный класс waRequest предоставляет удобный инструментарий для работы с файлами, загружаемыми на сервер по протоколу HTTP (с помощью элемента веб-формы <input type="file">).

Загрузка одного файла

Предположим, у нас есть следующая форма с одним элементом input типа file:

<form action="..." method="post" enctype="multipart/form-data">
  ...
  <input type="file" name="photo">
  ...
</form>

Для обработки файла, загружаемого через такую форму, необходимо обратиться к методу waRequest::file(), который возвращает экземпляр класса waRequestFile, позволяющего выполнять дальнейшую работу с загруженным файлом.

В действительности возвращается экземпляр класса waRequestFileIterator, однако в данном случае он работает в качестве прозрачной обертки вокруг единственного экземпляра waRequestFile в списке. Подробнее о классе waRequestFileIterator см. ниже раздел «Загрузка нескольких файлов».
$file = waRequest::file('photo');

Поля класса waRequestFile доступны только для чтения, их значение полностью аналогично таковым в массиве $_FILES:

Методы класса waRequestFile:

try {
  $file->waImage()
       ->resize(...)
       ->crop(..)
       ->save(...);
} catch(Exception $e) {
    echo "Файл не является изображением, либо произошла другая ошибка: ".$e->getMessage();
    return;
}

Подробнее о классе waImage см. раздел «Изображения».

Загрузка нескольких файлов

Рассмотрим загрузку файлов через форму с несколькими элементами input типа file с одинаковым именем:

<form action="..." method="post" enctype="multipart/form-data">
  ...
  <input type="file" name="photo[]">
  <input type="file" name="photo[]">
  <input type="file" name="photo[]">
  ...
</form>

Метод waRequest::file() возвращает экземпляр класса waRequestFileIterator:

$files = waRequest::file('photo');

В классе waRequestFileIterator доступны те же методы, что и в waRequestFile. Работают они так, как если бы применялись к первому файлу в списке. Вызов метода $files->uploaded() определяет, имела ли место загрузка хотя бы одного файла.

Класс waRequestFileIterator реализует интерфейс Iterator; это означает, что можно использовать цикл foreach для перебора списка загруженных файлов. Каждый элемент в списке представляет собой экземпляр класса waRequestFile, для которого доступны все описанные выше методы:

foreach($files as $file) {
    ...
}