#php #mongodb #canvas #gridfs
#php #mongodb #холст #gridfs
Вопрос:
Я рисую изображение на холсте и передаю данные canvas через AJAX в PHP-код, чтобы сохранить его в Mongo DB GridFS.
Хотя я могу получить URL-адрес данных и сохранить файл, но когда я извлекаю, чтобы показать изображение, оно не показывает изображение. Мой фрагмент кода для хранения выглядит следующим образом
$image = str_replace('data:image/jpeg;base64,', '', $_POST['dataurl']);
$decodedData = base64_decode($image);
try{
/*Get DB Connection for catagories document*/
$db = $this->registry->db->selectDB('myfiles');
// GridFS
$grid = $db->getGridFS();
$gridMetadata = array();
$gridMetadata['userid'] = $_POST['userid'];
$id = $grid->storeBytes($decodedData, $gridMetadata);
}
catch(MongoGridFSException $e){
echo $e;
}
для отображения изображения код
<?php
// Connect to Mongo and set DB and Collection
$mongo = new Mongo();
$db = $mongo->myfiles;
$gridFS = $db->getGridFS();
$image = $gridFS->findOne("IMG_0808.JPG");
header('Content-type: image/JPG');
echo $image->getBytes();
$mongo->close();
?>
Я думаю, что я неправильно сохраняю файл. Где я ошибаюсь. Любая помощь будет с благодарностью
Ответ №1:
Похоже, вы смешиваете методы здесь в своих попытках сохранить данные в кодировке Base64, которые вы получаете в запросе. Если вы хотите позже ссылаться на это с помощью «filename», что .findOne()
и делается неявно, тогда вам также необходимо сохранить эту «мета» информацию:
$image = str_replace('data:image/jpeg;base64,', '', $_POST['dataurl']);
$decodedData = base64_decode($image);
try{
/*Get DB Connection for catagories document*/
$db = $this->registry->db->selectDB('myfiles');
// GridFS
$grid = $db->getGridFS();
$gridMetadata = array();
$gridMetadata['filename'] = $_POST['filename'];
$gridMetadata['userid'] = $_POST['userid'];
$id = $grid->storeBytes($decodedData, $gridMetadata);
}
catch(MongoGridFSException $e){
echo $e;
}
Таким образом, вам понадобится «filename» в ваших данных POST, чтобы иметь возможность назначить «filename» в качестве мета-атрибута.
Теперь в вашем более позднем коде вы можете вызвать .findOne()
хранилище сетки, и оно будет соответствовать «имени файла»:
<?php
// Connect to Mongo and set DB and Collection
$mongo = new MongoClient();
$db = $mongo->myfiles;
$gridFS = $db->getGridFS();
$image = $gridFS->findOne("IMG_0808.JPG");
header('Content-Type: image/jpeg');
fpassthru($image->getResource());
$mongo->close();
?>
Убедитесь, что вы правильно указали информацию в своем «заголовке», чтобы клиент ее распознал.
В качестве подсказки сохраните тип MIME в качестве дополнительных метаданных при сохранении и прочитайте его при извлечении. Вы можете выполнить обычное .find()
чтение для стандартного объекта коллекции, чтобы прочитать это, поскольку это все, что нужно для MongoDB. Это должно помочь вашему коду не прерываться для разных форматов изображений.
P.S Используйте MongoClient, поскольку класс Mongo устарел.
Комментарии:
1. Я добавляю метаданные в качестве уникального имени пользователя и извлекаю их, используя то же самое. моя проблема не в поиске записи. Я могу его найти, но не могу его отобразить
2. @Shantanu Копирование и вставка снова меня заводят. Отсутствующей частью был
getResource()
метод и фактическое использованиеfpassthru()
для вывода потока ресурсов. Ваш вызовecho
просто пытается «stringify», что было бы не тем, что вы хотите.3. Спасибо, Нил — позвольте мне попробовать getResource() и вернуть
4. Проблема решена это была проблема с моим php, поскольку он пытался отобразить JPEG, а также другой HTML-контент, созданный PHP. Я поместил код JPEG в другой PHP и назвал его URL тега изображения. Сработало как шарм. Спасибо Нилу за ценные материалы
Ответ №2:
Проблема решена это была проблема с моим php, поскольку он пытался отобразить JPEG, а также другой HTML-контент, созданный PHP. Я поместил код JPEG в другой PHP и назвал его URL тега изображения. Сработало как шарм. Спасибо Нилу за ценные материалы