Canvas dataurl使用PHP保存到Mongodb数据网格

时间:2014-06-17 02:33:04

标签: php mongodb canvas gridfs

我在画布中绘制图像并将画布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();
?>

我想我没有正确存储文件。我哪里错了。任何帮助将不胜感激

2 个答案:

答案 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提供了一些有价值的建议