在MongoDBs GridFS中插入文件

时间:2012-03-19 10:41:02

标签: php mongodb gridfs

我正在尝试使用GridFS将一堆pdf文件插入到MongoDB中,但是在{em>路径中设置文件名称时出现错误MongoGridFSException em>,其中 name 是文件系统上pdf文档的绝对路径。

我正在使用一个非常简单的CLI脚本:

$it = new DirectoryIterator(__DIR__ .'/files');
while ($it as $file) {
    $grid->storeFile($file->getPathname(), array('metadata' => $metadata));
}

我发现GridFS缺乏文档令人不安。 MongoGridFSstoreFile()中的示例都只显示一个简单的文件名作为第一个参数;如果从这个文件名中检索数据,那么脚本会假设什么是basePath(cwd__DIR__或者完全不同的东西?)或者我可以添加绝对路径(从错误消息判断,可能不是)?

我正在考虑使用storeBytes(file_get_contents($file->getPathname())代替,但是当没有与之关联的文件名时,如何检索文件?我是否在第二个参数(options-array)中添加了文件名?

另外,如果我想知道存储文件的地雷/类型,我是否必须手动在元数据中指定它,还是在插入文件时自动确定?

TL; DR:我不知道如何使用GridFS并且php-docs质量很差。至少,有人能指出更好的例子/文档吗?

1 个答案:

答案 0 :(得分:3)

当我调用$ grid-> storeFile()时,我使用文件的完整路径。此外,是的,我将mime类型存储在元数据中。所以,我的电话看起来像这样:

$id = $grid->storeFile($uploaded_file, 
        array(
           'ownerNodeUuid'    => $additional['nodeUuid'],
           'ownerField'       => $additional['fieldUuid'],
           'originalFilename' => $name,
           'type'             => $type,
           'size'             => $size
        ), 
        array(
           'safe' => 1
        ));

这会创建一个这样的条目:

db.myPrefix.files.findOne();
{
    "_id" : ObjectId("4ea1912af3e145731c000010"),
    "ownerNodeUuid" : "74DAB098-4A6F-4172-84AB-EDAFAA9FE22D",
    "ownerField" : "C58AD24C-7A8C-402A-BE82-2D315BC5F7C0",
    "originalFilename" : "image001.png",
    "type" : "image/png",
    "size" : 73679,
    "filename" : "/tmp/phpNhAmGK",
    "uploadDate" : "Fri Oct 21 2011 16:35:06 GMT+0100 (BST)",
    "length" : 73679,
    "chunkSize" : 262144,
    "md5" : "3e36620fdfebdf9fbf311e996a4bc46c"
}

,所以在这种情况下$ uploaded_file =" / tmp / phpNhAmGK&#34 ;;

希望有所帮助。网上有很多例子,但我同意PHP库文档有时候有点稀疏...最好把它看作围绕MongoDB shell函数的简单包装,所以首先要做的就是我看起来总是MongoDB站点本身,然后当我理解MongoDB中应该做什么时,我会查找该PHP功能的PHP文档。