Системный класс 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
для обработки изображения.
Внимание! Если загруженный файл не является изображением, вызов конструктораwaImage()
вызоветException
. Поэтому рекомендуется использовать такой вызов в блоке: try/catch
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) { ... }