(PECL mongo >=0.9.0)
Utilitaires de stockage et lecture de fichiers dans la base de données
GridFS est une spécification de stockage que tous les pilotes implémentent. Simplement, il définit deux collections: files, pour les métadonnées du fichier, et chunks pour le contenu du fichier. Si le fichier est volumineux, il sera automatiquement scindé en sous-parties et chacune sera sauvée comme document dans la collection 'chunks' représentant le contenu du fichier.
Chaque document dans la collection 'files' est caractérisé par un nom, une date d'envoi et un hash md5. Il contient aussi un champ unique _id, qui peut être utilisé pour requêter la collection 'chunks' et obtenir le contenu du fichier. Chaque document dans la collection 'chunks' contient des données inaires, un champ files_id qui correspond au _id du fichier, et la position de ce document dans le fichier.
Par exemple, la collection 'files' ressemble à:
<?php
array("_id" => 123456789, "filename" => "foo.txt", "chunkSize" => 3, "length" => 12);
?>
<?php
array("files_id" => 123456789, "n" => 0, "data" => new MongoBinData("abc"));
array("files_id" => 123456789, "n" => 1, "data" => new MongoBinData("def"));
array("files_id" => 123456789, "n" => 2, "data" => new MongoBinData("ghi"));
array("files_id" => 123456789, "n" => 3, "data" => new MongoBinData("jkl"));
?>
Vous devriez être capable d'utiliser n'importe quel fichier créé par MongoGridFS avec n'importe quel driver et vis versa. Cependant, quelques drivers s'attendent à ce que toutes les méta-données associées avec un fichier soivent dans un champ "metadata". Si vous souhaitez utiliser un autre langage, ce peut être une bonne idée de placer les informations souhaitées dans un champ "metadata". Par exemple, au lieu de :
<?php
$grid->storeFile("somefile.txt", array("date" => new MongoDate()));
?>
utilisez quelque chose comme :
<?php
$grid->storeFile("somefile.txt", array("metadata" => array("date" => new MongoDate())));
?>
MongoGridFS représente les collections 'files' et 'chunks'. MongoGridFS étend MongoCollection, et une instance de MongoGridFS a accès à toutes les méthodes de MongoCollection, qui agissent sur la collection 'files':
<?php
$grid = $db->getGridFS();
$grid->update(array("filename" => "foo"), $newObj); // update on the files collection
?>
Un autre exemple de manipulation des méta-données:
<?php
// Sauvegarde un fichier
$id = $grid->storeFile("game.tgz");
$game = $grid->findOne();
// Ajoute un compteur de téléchargement
$game->file['downloads'] = 0;
$grid->save($game->file);
// Incrémente le compteur
$grid->update(array("_id" => $id), array('$inc' => array("downloads" => 1)));
?>
Vous pouvez aussi accéder aux objets dans la collection 'chunks' depuis une instance de MongoGridFS:
<?php
$chunks = $grid->chunks; // $chunks est une MongoCollection
$chunks->insert(array("x" => 4));
?>
Il existe des méthodes dans MongoGridFS qui ont le même no que dans MongoCollection mais elles se comportent différement. Par exemple, MongoGridFS::remove() suppriment les objets qui correspondent au critère depuis la collection des fichiers ('files'), ainsi que leur contenu depuis la collection des données ('chunks').
Pour stocker un nouvel enregistrement dans GridFS, il y a plusieurs options. Si vous possédez un nom de fichier, agissez comme cela:
<?php
$grid->storeFile($filename, array("whatever" => "metadata", "you" => "want"));
?>
Si vous avez une chaine d'octets qui n'est pas un fichier, vous pouvez la stocker grâce à MongoGridFS::storeBytes():
<?php
$grid->storeBytes($bytes, array("whatever" => "metadata", "you" => "want"));
?>
Requêter une collection MongoGridFS retourne un MongoGridFSCursor, qui se comporte comme un MongoCursor normal sauf qu'il retourne des MongoGridFSFiles plutôt que des tableaux associatifs.
MongoGridFSFiles peut être écrit sur le disque en utilisant MongoGridFSFile::write() ou récupéré de la mémoire avec MongoGridFSFile::getBytes(). Il n'y a pas de méthode actuellement qui guide les données d'un à l'autre, mais ce n'est pas très difficile à écrire en utilisant $grid->chunks de la collection.
Les objets MongoGridFSFile contiennent un champ file qui contient les méta-données du fichier.
NULL
;NULL
;$bytes
[, array $metadata
= array()
[, array $options
= array()
]] )$filename
[, array $metadata
= array()
[, array $options
= array()
]] )