Я пытаюсь вставить кучу 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 имеют низкое качество. Может, по крайней мере, кто-то указывает лучшие примеры/документацию?
Я как раз собирался отредактировать вопрос. Кажется, что какая-то проблема с кодировкой перепутала символ в пути, и это вызывало первоначальные проблемы. К сожалению, когда я запускаю свой скрипт сейчас, возвращается «Ошибка сегментации», которая, как представляется, исходит от MongoDB, а не PHP, и вероятно, из-за чего-то в '$ extras'. – dbrumann
Попробуйте сделать var_dump на то, что вы отправляете в MongoDB, и воссоздаете команду в оболочке Mongo - посмотрите, если вы получите seg fault then. Также посмотрите, какую версию MongoDB вы используете, и посмотрите, есть ли какие-либо известные проблемы с используемой версией расширения PHP MongoDB (получите это от phpinfo();) –
В моем примере вы можете увидеть, какие поля добавляются автоматически, и какие поля необходимо добавить. В моем примере я фактически дублирую свойство length (и называю его «size»). Вам нужно добавить тип mime, если вам это нужно. Возможно, вам захочется сохранить имя файла без дальнейшего использования. –