1

我正在尝试使用 GridFS 将一堆 pdf 文件插入 MongoDB,但收到一条MongoGridFSException消息:error setting up file name in path,其中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())改用,但是当没有与之关联的文件名时,如何检索文件?我是否在第二个参数(选项数组)中添加文件名?

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

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

4

1 回答 1

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";

希望有帮助。网上有很多例子,但我同意 PHP 库文档有时有点稀疏......最好将其视为 MongoDB shell 函数的简单包装,所以我首先看的总是MongoDB 站点本身,然后当我了解应该在 MongoDB 中做什么时,我会查找该功能的 PHP 版本的 PHP 文档。

于 2012-03-19T12:01:24.790 回答