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

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

Системный класс waRequest содержит инструментарий для работы с файлами, загружаемыми на сервер с помощью элемента веб-формы <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:

  • $file->name;
  • $file->type;
  • $file->size;
  • $file->tmp_name; значение этого поля также можно получить, если привести переменную $file к типу string:

    $tmp_file_name = (string) $file;
  • $file->error;
  • $file->extension; — расширение файла, полученное из оригинального имени файла.

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

  • $file->uploaded() — возвращает true, если имела место загрузка файла на сервер (т. е. значение поля input типа file в веб-форме было непустым); в случае если файл не был загружен на сервер (т. е. если $file->uploaded() возвращает false), вызов всех остальных методов класса waRequestFile вернёт экземпляр объекта исключения типа waException;
  • $file->moveTo('path/to/file') перемещает загруженный файл в указанный каталог (аналогично PHP-функции move_uploaded_file());
  • $file->moveTo('path/to/dir', 'filename') то же самое, но с присвоением нового имени загруженному файлу;
  • $file->copyTo('path/to/file') копирует загруженный файл в указанный каталог;
  • $file->copyTo('path/to/dir', 'filename') то же самое, но с присвоением нового имени созданной копии файла;
  • $file->waImage() возвращает экземпляр класса waImage для обработки изображения.
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) {
    ...
}