Класс File Uploading
Этот класс позволяет заливать файлы на сервер. При этом Вы можете задавать различные критерии заливки, например, тип файлов или их максимальный размер.
Как это происходит
Загрузка файла включает в себя следующие этапы:
- Отрисовывается форма загрузки, позволяющая пользователю выбрать файл и загрузить его.
- После сабмита формы файл закачивается в выбранную пользователем папку.
- Далее файл проверяется по заданным пользователем критериям.
- Если загрузка прошла успешно, пользователю показывается сообщение об этом.
Чтобы продемонстрировать этот процесс в действии, давайте разберем конкретный пример. Ну а в конце Вы найдете описание класса.
Создаем форму загрузки
В текстовом редакторе создайте файл и назовите его upload_form.php. Вставьте туда код, представленный ниже, и сохраните в папке application/views/:
Как видно из примера, мы использовали хелпер форм для создания открывающего тэга формы. Для загрузки файлов необходима форма с атрибутом multipart, а хелпер создаст нам правильный синтаксис. Также мы использовали переменную $error. Она нужна для того, чтобы показать сообщения об ошибках, если пользователь сделает что-то не так.
Страница уведомления о завершенной загрузке
В текстовом редакторе создайте файл и назовите его upload_success.php. Вставьте туда код, представленный ниже и сохраните в папке application/views/:
Контроллер
В текстовом редакторе создайте файл и назовите его upload.php. Это будет контроллер. Вставьте в файл код, представленный ниже и сохраните в папкеapplication/controllers/:
Папка загрузки
Ещё нам понадобится папка, куда будут сохраняться загруженные файлы. Создайте папку там, где у вас установлен CodeIgniter, назовите её uploads и выставьте права доступа 777.
Пробуем!
Чтобы проверить форму в действии, зайдите на сайт, используя URL, похожий на этот:
example.com/index.php/upload/
По идее, Вы должны увидеть форму загрузки. Попробуйте загрузить картинку (jpg, gif или png). Если путь в контроллере прописан верно, то все должно работать.
Описание класса
Инициализация класса Upload
Так же, как и большинство классов в CodeIgniter, класс Upload инициализируется в контроллере функцией $this->load->library:
$this->load->library('upload');
После загрузки класса к его объектам можно будет обращаться, используя конструкцию: $this->upload
Установка параметров
Так же, как и в других библиотеках, вы можете задавать критерии загрузки, используя различные параметры. В контроллере, созданном выше, вы использовали следующие из них:
$config['upload_path'] = './uploads/';
$config['allowed_types'] = 'gif|jpg|png';
$config['max_size'] = '100';
$config['max_width'] = '1024';
$config['max_height'] = '768';
$this->load->library('upload', $config);
// Вы можете также установить параметры, вызвав функцию инициализации. Используйте её, если класс загружается автоматически:
$this->upload->initialize($config);
Собственно, параметры, описанные выше не нуждаются в разъяснениях. Ниже приведена таблица всех возможных параметров.
Параметры
Доступны следующие параметры. Значение по умолчанию будет применяться, если параметр не задан явно.
| Параметр | Значение по умолчанию | Опции | Описание |
|---|---|---|---|
| upload_path | Нет | Нет | Путь до папки, куда будет загружен файл. У папки должны быть выставлены права на запись, а путь может быть как абсолютным, так и относительным. |
| allowed_types | Нет | Нет | Типы MIME, описывающие типы файлов, разрешенных для загрузки. Обычно в качестве MIME-типа используется расширение файла. Несколько типов разделяются вертикальной чертой. |
| overwrite | FALSE | TRUE/FALSE (boolean) | Если TRUE, и в папке уже есть файл с тем же именем, что и заливаемый, то он будет перезаписан. Если false, то перезаписи не будет, а к имени заливаемого файла добавится порядковый номер. |
| max_size | 0 | Нет | Максимальный размер файла (в килобайтах). Если ограничения нет, то пишем 0. На заметку: на многих серверах с установленным PHP имеется ограничение на размер заливаемых файлов, записанное в файле php.ini. Как правило, по умолчанию устанавливается 2 МБ (2048 КБ). |
| max_width | 0 | Нет | Максимальная ширина картинки в пикселях. 0 — не ограниченно. |
| max_height | 0 | Нет | Максимальная высота картинки в пикселях. 0 — не ограниченно. |
| encrypt_name | FALSE | TRUE/FALSE (boolean) | Если TRUE, то имя файла преобразуется в случайным образом сгенерированную строку. Может быть полезно, если хотите, чтобы залитый файл не мог быть распознан заливающим. |
| remove_spaces | TRUE | TRUE/FALSE (boolean) | Если TRUE, то все пробелы в имени файла будут преобразованы в знак подчеркивания. Рекомендуется всегда использовать данную опцию. |
Устанавливаем параметры через файл конфигурации
Если вам не нравится метод задания параметров, описанный выше, можете задавать их, используя файл конфигурации. Просто создайте новый файл с именем upload.php и добавьте туда массив $config. Затем сохраните файл в папку config/upload.php, и он подключится автоматически. При этом вам НЕ НУЖНО использовать конструкцию $this->upload->initialize.
Описание функций
Доступны следующие функции
$this->upload->do_upload()
Начинает загрузку файла с параметрами, заданными вами ранее. На заметку: по умолчанию upload ожидает файл из поля с именем userfile, а сама форма должна быть типа multipart
<form method="post" action="some_action" enctype="multipart/form-data" />
Если же поле имеет другое имя, то просто передайте его в качестве параметра функции do_upload:
$field_name = "some_field_name";
$this->upload->do_upload($field_name)
$this->upload->display_errors()
Возвращает сообщения об ошибке, если do_upload() вернула FALSE. Сообщения не выдаются на экран автоматически. Функция возвращает данные, которые затем в любой момент можно вывести на экран
Форматированный вывод ошибок
По умолчанию функция, описанная выше, выводит ошибки, не заключая их в теги <p>. Вы можете задать свои собственные разделители. Например:
$this->upload->display_errors('<p>', '</p>');
$this->upload->data()
Это функция-хелпер, возвращающая массив, содержащий все данные о загруженном файле. Ниже показан прототип массива:
Array
(
[file_name] => mypic.jpg
[file_type] => image/jpeg
[file_path] => /path/to/your/upload/
[full_path] => /path/to/your/upload/mypic.jpg
[raw_name] => mypic
[orig_name] => mypic.jpg
[file_ext] => .jpg
[file_size] => 22.2
[is_image] => 1
[image_width] => 800
[image_height] => 600
[image_type] => jpeg
[image_size_str] => width="800" height="200"
)
Пояснение
Далее приводится описание полей вышеописанного массива:
| Поле | Описание |
|---|---|
| file_name | Имя загруженного файла, включая расширение. |
| file_type | MIME-тип файла |
| file_path | Абсолютный путь к файлу на сервере. |
| full_path | Абсолютный путь до файла на сервере, включая имя файла |
| raw_name | Имя файла без расширения |
| orig_name | Первоначальное имя файла. Используется только при включенной опции encrypted_name. |
| file_ext | Расширение файла с точкой |
| file_size | Размер файла в килобайтах |
| is_image | Проверка на предмет является ли файл изображением. 1 = изображение. 0 = нет. |
| image_width | Ширина изображения. |
| image_heigth | Высота изображения |
| image_type | Тип изображения. Как правило - расширение файла без точки. |
| image_size_str | Строка, включающая в себя параметры width и height. Полезно использовать внутри тэга img. |