2012-03-19 2 views
1

Я пытаюсь вставить кучу PDF-файлы в MongoDB используя GridFS, но получить MongoGridFSException с сообщением: ошибка созданием файла имени в пути, где имя является абсолютный путь к pdf-документу в файловой системе.Вставить файлы в MongoDBs GridFS

Я использую очень простой CLI-скрипт:

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

Я считаю отсутствие документации GridFS тревожной. Примеры в MongoGridFS и storeFile() все просто показывают простое имя файла в качестве первого аргумента; если данные извлекаются из этого имени файла, то какой basePath использует сценарий (cwd, __DIR__ или что-то совсем другое?) или я могу просто добавить абсолютный путь (судя по сообщению об ошибке, возможно, нет)?

Вместо этого я размышлял об использовании storeBytes(file_get_contents($file->getPathname()), но тогда как я могу получить файл, если нет имени файла, связанного с ним? Добавить имя файла во втором аргументе (options-array)?

Кроме того, если я хочу знать шахту/тип сохраненного файла, нужно ли его вручную указывать в метаданных или это определяется автоматически при вставке файла?

TL; Я не знаю, как работать с GridFS, а php-docs имеют низкое качество. Может, по крайней мере, кто-то указывает лучшие примеры/документацию?

ответ

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-версии этой функциональности.

+0

Я как раз собирался отредактировать вопрос. Кажется, что какая-то проблема с кодировкой перепутала символ в пути, и это вызывало первоначальные проблемы. К сожалению, когда я запускаю свой скрипт сейчас, возвращается «Ошибка сегментации», которая, как представляется, исходит от MongoDB, а не PHP, и вероятно, из-за чего-то в '$ extras'. – dbrumann

+0

Попробуйте сделать var_dump на то, что вы отправляете в MongoDB, и воссоздаете команду в оболочке Mongo - посмотрите, если вы получите seg fault then. Также посмотрите, какую версию MongoDB вы используете, и посмотрите, есть ли какие-либо известные проблемы с используемой версией расширения PHP MongoDB (получите это от phpinfo();) –

+0

В моем примере вы можете увидеть, какие поля добавляются автоматически, и какие поля необходимо добавить. В моем примере я фактически дублирую свойство length (и называю его «size»). Вам нужно добавить тип mime, если вам это нужно. Возможно, вам захочется сохранить имя файла без дальнейшего использования. –

Смежные вопросы