1

GridFS を使用して一連の PDF ファイルを MongoDB に挿入しようとしていますが、次メッセージMongoGridFSExceptionが表示されます

私は非常に単純な 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())が、ファイル名が関連付けられていない場合、ファイルを取得するにはどうすればよいですか? 2 番目の引数 (options-array) にファイル名を追加しますか?

また、保存されているファイルの鉱山/タイプを知りたい場合、メタデータで手動で指定する必要がありますか?それとも、ファイルを挿入するときに自動的に決定されますか?

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 シェル関数の単純なラッパーと考えるのが最善なので、私が最初に見るのは常にMongoDB サイト自体を調べて、MongoDB で何をすべきかを理解したら、その機能の PHP バージョンに関する PHP ドキュメントを探します。

于 2012-03-19T12:01:24.790 に答える