我在画布中绘制图像并将画布dataURL通过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();
?>
我想我没有正确存储文件。我哪里错了。任何帮助将不胜感激
答案 0 :(得分:0)
您似乎在尝试混合方法来存储您在请求中收到的Base64编码数据。如果你想稍后通过“文件名”引用它,这是.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;
}
因此,您需要在POST数据中使用“文件名”才能将“文件名”指定为元属性。
现在在以后的代码中,您可以在网格存储上调用.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 :(得分:0)
问题解决了我的php的问题,因为它试图显示JPEG以及其他PHP生成的HTML内容。我将JPEG代码放在不同的PHP中,并将其称为图像标记的URL。工作就像一个魅力。感谢Neil提供了一些有价值的建议