Класс FileStorage управляет хранимыми файлами. Имеет методы upload, download и delete.
Класс FileRecordManager хранит записи о загруженных файлах. Имеет метод getIterator():ArrayIterator для доступа к записям.
Оба класса унаследованы от Component. Component дает удобный интерфейс для инициализации объекта, навешивания событий и некоторой магии со свойствами.
Загрузка файла выглядит так:
$storage = new FileStorage($config);
$storage->addEvent('onUpload', 'extraImageCheck');
$num = $storage->upload('attach', $subject);
$errors = $storage->getErrors();
здесь extraImaheCheck - колбэк для тестирования файла после загрузки, attach - имя поля с файлом, $subject - комментарий к файлу/пачке файлов. getErrors() вернет массив сообщений с ошибками (если были)
Если загрузка прошла ($num>0), то можно добыть инфу о только что сохраненных файлах:
$newRecords = $storage->getRecords();
где каждый элемент масива $newRecords выглядит как
array(
'type' => $type, // mime
'target' => $target, // путь до сохраненного файла
'name' => $name, // оригинальное имя файла
'size' => $size, // размер
'subject' => $this->_subject, // коментарий
'uploaded' => $this->_uploaded // время
)
эту инфу сам FileStorage не сохраняет на постоянку, необходимо поручить это FileRecordManager
$manager = new FileRecordManager($config);
$it = $manager->getIterator();
foreach ($newRecords as $rec) {
$it->append($rec);
}
$manager->close();
Для скачки надо проделать такую работу: получить по id запись из FileRecordManager и подсунуть эту запись в FileStorage download()
Таким образом я разделил функционал. Менеджер записей и Хранилище файлов знают только свою часть картины. В примере записи хранятся в файле в сериализованном виде. В перспективе будет версия с БД.
От вас, господа, я жду замечаний по существу. Может быть кто-то укажет на потенциальные уязвимости. Что будет если подсунуть фейковые данные в post-запрос? Достаточно ли я защищен если использую move_uploaded_file() ?
update: не поленитесь промотать тему, есть более свежие и интересные версии