Не удается получить доступ к файлу GridFS, хранящемуся в MongoDB / PHP

#php #mongodb #gridfs

Вопрос:

Для проекта я хочу иметь возможность загрузить PDF-файл, который ранее был сохранен в документе MongoDB с помощью GridFS.

Я новый разработчик, и это мой первый раз, когда я использую понятия «Загрузка/загрузка» и «потоки», поэтому я могу пойти на это совершенно неправильно и упустить что-то очевидное, но я не вижу, где я могу пойти не так. Насколько я знаю, может быть, моя загрузка плохо начинается, и именно поэтому я ничего не могу загрузить !

Я просматривал этот документ MongoDB, чтобы попытаться запустить загрузку, но безрезультатно.

У меня есть страница, отображающая все мои данные MongoDB в таблице (каждая строка = один документ), и в этих строках ссылка для открытия новой страницы для загрузки/просмотра файла PDF, ранее загруженного в этот конкретный документ.

Проблема в том, что когда я захожу по этой ссылке, ну, ничего не происходит, у меня пустая страница.

Вот страница, на которой я отображаю данные и имею форму для загрузки новых данных с загрузкой файла, если это необходимо.

 <?php
require 'vendor/autoload.php';

try {
    $mng = new MongoDBDriverManager("mongodb://localhost:27017/dbname");
    $bucket = new MongoDBGridFSBucket($mng, 'dbname');
    $query = new MongoDBDriverQuery([]);
    $r = $mng->executeQuery("dbname.dbname", $query);

    if (!empty($_POST["date"])){
        $document = array(
            "num_id"         => $_POST["num_id"],
            "name"            => $_POST["name"],
            "date"    => $_POST["date"],
            "detail"           => $_POST["detail"],
        );
        if ($_FILES['pdf']) {
            $stream = $bucket->openUploadStream($_FILES['pdf']['tmp_name']);
            $document['pdf'] = $bucket->uploadFromStream($_FILES['pdf']['name'], $stream);
        }
        $single_insert = new MongoDBDriverBulkWrite();
        $single_insert->insert($document);
        $mng->executeBulkWrite("rs.rs", $single_insert);
    } 
} 
catch (Exception $e) {
    echo 'Exception reçue : ',$e->getMessage(),"n";
}
?>

<table>
    <thead>
        //Columns titles for data
    </thead>
    <tbody>
        <?php foreach ($r as $document):
        $bson = MongoDBBSONfromPHP($document);
        $json = json_decode(MongoDBBSONtoJSON($bson));
        ?>
            <tr>
                <td><?php echo date('d-m-Y',strtotime($json->{'date'})) ?></td>
                <td><?php echo $json->{'num_id'} ?></td>
                <td><?php echo $json->{'name'} ?></td>
                <td><?php echo $json->{'detail'} ?></td>
                <td><?php if (!empty($json->{'pdf'})) {
                    echo '<a href="file.php?id=' . $document->pdf . '">File</a>';
                    }
                    else {
                        echo "";
                    } ?></td>
            </tr>
        <?php endforeach; ?>
    </tbody>
</table>
<form action="" enctype="multipart/form-data" method="POST">
    //Other inserts for the main document(date, name, detail,..)
    <p>
        <label for="pdf">Document</label><br>
        <input type="file" id="pdf" name="pdf">
    </p>
    <p>
        <input type="submit" id="addform" value="Add">
    </p>
</form>
 

И вот мой file.php куда отправляется пользователь после нажатия на ссылку в таблице и где я пытаюсь получить доступ к данным, хранящимся в GridFS

 <?php
require 'vendor/autoload.php';

try {
    $mng = new MongoDBDriverManager("mongodb://localhost:27017/dbname");
    $bucket = (new MongoDBClient)->dbname->selectGridFSBucket();
    $fileId = new MongoDBBSONObjectID($_GET['id']);
    $stream = $bucket->openDownloadStream($fileId);
    $contents = stream_get_contents($stream);
} 
catch (Exception $e) {
    echo 'Exception reçue : ',$e->getMessage(),"n";
}
?>
 

И с помощью этого кода. Несмотря на то, что $GET[‘id’] действительно является _id документа в dbname.fs.файлах, я ничего не получаю взамен, даже ошибки.
Вот как выглядит структура документов при использовании MongoDB Compass

Надеюсь, я выразился достаточно ясно и благодарю вас за то, что вы читали меня до сих пор.

Комментарии:

1. Если вы не получили никаких ошибок, просмотрите настройки отчетов об ошибках php. Затем вы можете отладить возникшую у вас проблему с gridfs.

2. @D.SM Мои отчеты об ошибках настроены E_ALL и отображаются правильно (обычно). Но при доступе к file.php?id=IdLinkingToAnFsFilesDocument я нахожусь на пустой странице.