В первой главе вкратце упоминалась система GridFS, которая позволяет хранить большие объекмы информации и файлы. Драйвер PHP для MongoDB предоставляет набор классов, необходимых для работы с GridFS:
MongoGridFS: позволяет сохранять и извлекать информацию из бд
MongoGridFSFile: позволяет работать с отдельными файлами
MongoGridFSCursor: работает с курсорами
Для сохранения файла в системе GridFS используется функция storeUpload, которая принимает два параметра: название файла и метаданные и возвращает
идентификатор _id
сохраненного файла. Например, у нас есть некоторая форма для загрузки файла:
<html> <head> </head> <body> <form action="./" method="POST" enctype="multipart/form-data"> <input type="file" name="txtlog" /> <button>Send</button> </form> </body> </html>
И скрипт ./, который обрабатывает форму:
$con = new MongoClient(); $db= $con-> test; // Получаем объект класса GridFS $gridFS = $db -> getGridFS(); // Получаем поле input в разметке HTML, которое имеет атриубут name=image $file = 'txtlog'; // Определяем метаданные файла $metadata = array('uploadDate' => new MongoDate()); // загружаем файл и возвращаем id $id = $gridFS -> storeUpload($file, $metadata); echo $id;
Метод getGridFS позволяет получить объект класса MongoGridFS и вызвать для полученного файла метод storeUpload
.
Данный метод возвращает идентификатор, который мы можем использовать по своему усмотрению, например, связать с каким-нибудь объектом в коллекции.
Для получения файлов из бд мы можем воспользоваться опять же методом findOne
класса GridFS (или методом find).
Метод findOne возвращает объект класса MongoGridFSFile, который инкапсулирует всю функциональность для работы с файлом.
Посмотрим на примере:
$con = new MongoClient(); $db= $con-> test; // Получаем объект класса GridFS $gridFS = $db -> getGridFS(); // Получаем файл по id $file = $gridFS -> findOne(array('_id' => new MongoId('52e10cd4bd8c428c0900002a'))); // посылаем пользователю бинарное представление файла echo $file -> getBytes(); con -> close();
Для получения файла идет фильтрация по id - объект MongoId получаем id и делаем выборку. Можно было бы применить и другой фильтр, например, по названию:
$file = $gridFS -> findOne('22.txt')
или вообще не передавать никакой фильтр и взять первый файл из выборки.
Класс MongoGridFSFile обладает некоторыми методами, которые позволяют манипулировать файлом:
getBytes
: возвращает содержимое сайта в виде набора байтов
getFilename
: возвращает имя файла
getResource
: возвращает ресурс, который может использоваться для чтения сохраненного файла
getSize
: возвращает размер файла
write
: пишет файл на диск
В данном случае для отдачи файла пользователю мы используем метод getBytes
, и пользователь сможет увидеть текстовый файл в браузере.
Удаление файла из системы GridFS производится с помощью метода delete
, в который передается id файла:
$con = new MongoClient(); $db= $con-> test; $gridFS = $db -> getGridFS(); $gridFS -> delete(new MongoId('52e10cd4bd8c428c0900002a')); con -> close();