原生PHP或Thinkphp5之存储mongodb图片文件流GridFS操作

PHP存储mongodb图片文件流

首先说明一下:百度查询搜索的这些信息都是老本报版本的了不管用了

原生PHP或Thinkphp5之存储mongodb图片文件流GridFS操作_第1张图片

百度一下都是直接调用getGridFS这个方法。我的推测是:这个方法应该是几年前的老版本的扩展了或者驱动。对于目前的一些新版本是没有此方法可以直接调用GridFS对象了。

原生PHP或Thinkphp5之存储mongodb图片文件流GridFS操作_第2张图片

讲解流程:
1.安装MongoDB(运行MongoDB)
2. 安装PHP扩展
3. Composer安装MongoDB驱动(注:在Wamp环境安装时有个坑,个人认为是比较坑的,大家随意认为不是坑的,勿喷)
4. 原生PHP存储MongoDB文件流
5. Thinkphp5存储MongoDB文件流(有个小小的封装好的增删查,可以下载直接使用)

一.安装MongDB 首先下载MongoDB

下载地址:https://www.mongodb.com/download-center#community 根据自己环境下载MongoDB

原生PHP或Thinkphp5之存储mongodb图片文件流GridFS操作_第3张图片

你可以通过点击 “Custom(自定义)” 按钮来设置你的安装目录。

原生PHP或Thinkphp5之存储mongodb图片文件流GridFS操作_第4张图片

下一步安装 “install mongoDB compass” 不勾选,否则可能要很长时间都一直在执行安装。

原生PHP或Thinkphp5之存储mongodb图片文件流GridFS操作_第5张图片

安装成功后:
1.在安装根目录新建config.conf文件 将以下代码复制进去。路径与自己的对比我的是在F盘下。

#配置数据库存储路径,可以是任意位置
dbpath=F:\mongodb\db
#日志的存储路径,必须指定一个log文件
logpath=F:\mongodb\log\log.log
#日志追加,不覆盖
logappend=true
auth=true

2.根目录新建db文件夹

//通过执行mongod.exe,使用–install选项来安装服务,使用–config选项来指定之前创建的配置文件。
F:\mongodb\bin\mongod.exe --config “F:\mongodb\mongod.cfg” --install
//运行MongoDB服务命令 F:\mongodb\bin\mongod --dbpath F:\mongodb\db

原生PHP或Thinkphp5之存储mongodb图片文件流GridFS操作_第6张图片
注:cmd不要关闭,关闭后则是关闭服务
3.添加环境变量
原生PHP或Thinkphp5之存储mongodb图片文件流GridFS操作_第7张图片
打开一个新的cmd运行命令 mongo
原生PHP或Thinkphp5之存储mongodb图片文件流GridFS操作_第8张图片
即可操作mongodb
注:新版本需添加用户权限(百度一下挺多的)

另外推荐看看这里的安装与运行(老版本的)http://www.runoob.com/mongodb/mongodb-tutorial.html
Navicat for MongoDB管理工具也蛮不错的。可以下载试用一下,链接mongodb

二.安装PHP扩展
1.下载扩展 https://pecl.php.net/package/mongodb 下载对应版本
原生PHP或Thinkphp5之存储mongodb图片文件流GridFS操作_第9张图片

将下载好的解压将php_mongodb.dll 复制到目前环境php版本下的ext文件中

原生PHP或Thinkphp5之存储mongodb图片文件流GridFS操作_第10张图片
打开php.ini配置文件 将以下代码复制进去 重启服务

[mongodb]
extension=php_mongodb.dll

输出phpinfo(); 看到mongodb则扩展成功
原生PHP或Thinkphp5之存储mongodb图片文件流GridFS操作_第11张图片
三.Composer安装 mongodb/mongodb
根据mongodb版本下载对应的驱动
mongodb/mongodb驱动地址: https://packagist.org/packages/mongodb/mongodb
原生PHP或Thinkphp5之存储mongodb图片文件流GridFS操作_第12张图片
根据版本运行对应版本命令:

 composer require mongodb/mongodb v1.4.x-dev

原生PHP或Thinkphp5之存储mongodb图片文件流GridFS操作_第13张图片
如果你的是Wamp环境 那么坑来啦。

提示:mongodb扩展未找到,可是phpinfo里mongodb扩展是存在的

原生PHP或Thinkphp5之存储mongodb图片文件流GridFS操作_第14张图片
Composer是根据 php -m 查看当前php扩展 原因就来了MongoDB居然没有!!!
原生PHP或Thinkphp5之存储mongodb图片文件流GridFS操作_第15张图片
原因:

Wamp 修改的php.ini配置文件是修改的Apache下的php.ini
然而由于Composer安装时是安装在php文件下并且Cmposer获取的php文件下的php.ini配置文件
解决方案:将Apache下的php.ini复制到php文件下把php文件下的配置文件替换掉即可解决.

四.原生PHP存储MongoDB文件流
1.添加文件流

//首先引入驱动
require './vendor/autoload.php';
//链接MongoDB
$clent=new MongoDB\Client("mongodb://root:root@localhost:27017");//连接数据库

$gridFsCollection=$clent->test->selectGridFSBucket();//这里只指定了databases,collection按照默认的来就行
$fileName='wenjianming';//文件名
$file=fopen('./timg.jpg','rb');//读取文件存入内存
//存储文件流图片
$gridFsResult=$gridFsCollection->uploadFromStream($fileName,$file);//返回fs.file中的_id
//打印ID
print_r($gridFsResult);die;

存储后返回的图片ID 将其存到关系型数据库中,根据业务需求而写。
原生PHP或Thinkphp5之存储mongodb图片文件流GridFS操作_第16张图片
//文件存放位置
原生PHP或Thinkphp5之存储mongodb图片文件流GridFS操作_第17张图片
2.查询文件

test->selectGridFSBucket();//这里只指定了databases,collection按照默认的来就行
//获取文件id
$fileId = new MongoDB\BSON\ObjectId('5cba543579fd063930007d22');
//查询文件并暂时存储在内存中
$stream=$gridFsCollection->openDownloadStream($fileId);
//生成二进制流数据 stream_get_contents写入到一个字符串
$contentString=stream_get_contents($stream);
//如文件是图片需设置header
header('Content-Type: image/jpeg; charset=UTF-8');
echo $contentString;die;


展示当前文件。
此处原生PHP文件流就结束了,就是如此简单。
这里附上MongoDB php库的文档 https://docs.mongodb.com/php-library/current/tutorial/gridfs/ 强烈推荐看

五.Thinkphp5存储MongoDB文件流
//Mongodb 封装的方法

gridFsCollection = (new \MongoDB\Client("mongodb://localhost:27017"))->test->selectGridFSBucket();
    }

    public  function getImg($id='')
    {
        if (empty($id)){
            return Return_json(1,400,'ID不可为空');
        }
        vendor('mongodb');
        $clent=  new \MongoDB\Client("mongodb://localhost:27017");
        $gridFsCollection=$clent->test->selectGridFSBucket();
        $fileId = new \MongoDB\BSON\ObjectId($id);
        $stream=$gridFsCollection->openDownloadStream($fileId);
        $contentString=stream_get_contents($stream);//二进制流数据
        header('Content-Type: image/jpeg; charset=UTF-8');
        echo $contentString;
    }

    //封装上传图片
    public  function addImg($file='')
    {
        vendor('mongodb');

        if (empty($file)){
            return Return_json(1,400,'图片不可为空');
        }
        //获取图片路径
       $url = Image_upload($file);

        if(file_exists($url))
        {
            //进行读取文件
            $fileName = $uniqid = md5(uniqid(microtime(true),true));
            //读取文件存放内存
            $file=fopen($url,'rb');
            //二进制流存储mongodb
            $gridFsResult=$this->gridFsCollection->uploadFromStream($fileName,$file);//返回fs.file中的_id
            //判断是否拥有ID
            //销毁图片
            if (!unlink($url)){
                return Return_json(1,400,'销毁图片失败');
            }
            if(empty($gridFsResult))
            {
                return Return_json(1,400,'mongodb未返回ID');
            }
            //返回ID
            return $gridFsResult;
        }else{
            return Return_json(1,400,'图片上传失败');
        }
    }

    //执行删除
    public function delImg($id='')
    {
        if (empty($id)){
            return Return_json(1,400,'ID不可为空');
        }
        //生成ID
        $fileId = new \MongoDB\BSON\ObjectId($id);
        $del = $this->gridFsCollection;
        $resurl = $del->delete($fileId);
        return $resurl;
    }
}

公共common存放代码

//单图上传
 function Image_upload($file){

    // 移动到框架应用根目录/public/uploads/ 目录下
    if($file){
        $info = $file->move(ROOT_PATH . 'public' . DS . 'uploads');
        if($info){
            // 输出 20160820/42a79759f284b767dfcb2a0197904287.jpg
            return './uploads/'.$info->getSaveName();
        }else{
            // 上传失败获取错误信息
            echo $file->getError();
        }
    }
}
function Return_json($status,$code,$message,$data=[])
{
    $data = ['status'=>$status,'code'=>$code,'message'=>$message,'data'=>$data];
    return json_encode($data);
}

方法调用:

//添加文件
必须将:common文件继承后
	//上传文件
    self::addImg(input('file.image'))
    //查看文件
    self::getImg($id);
    //删除图片
    self::delImg($id);

Thinkphp5的方法只写了个把小时,没怎么优化大家可以直接拿过去根据这个进行优化。
到此就结束了。
代码虽简单,可资料难找。
如有不对之处,还望告知与我。
如果有问题欢迎大家与我联系QQ:1462263367

你可能感兴趣的:(原生PHP或Thinkphp5之存储mongodb图片文件流GridFS操作)