#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
я нахожусь на пустой странице.