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

PHP存储mongodb图片文件流

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

1885b6e19a106a2734dc34bbd24a619e.png

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

72a90dd086d4af87466c9a5f7d593a6e.png

讲解流程:

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

cb002ae1814d3c815f2aea8116a5d69b.png

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

7010e373e729bd3c26966b673b1001ce.png

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

b271b59d7c7af6bcfb7b4dbee351c7f3.png

安装成功后:

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

dc47f61e744c50ad21fe0b8791bc9b6b.png

注:cmd不要关闭,关闭后则是关闭服务

3.添加环境变量

2f099f802433233d575ec52ffba49d3f.png

打开一个新的cmd运行命令 mongo

b090fa55bb6649225fd005e12e32f57b.png

即可操作mongodb

注:新版本需添加用户权限(百度一下挺多的)

另外推荐看看这里的安装与运行(老版本的)http://www.runoob.com/mongodb/mongodb-tutorial.html

Navicat for MongoDB管理工具也蛮不错的。可以下载试用一下,链接mongodb

二.安装PHP扩展

1.下载扩展 https://pecl.php.net/package/mongodb 下载对应版本

170e537ca3bcb5e800614fc34cac233b.png

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

6ccdb19e3e7cf1d175c5940eae45c32b.png

打开php.ini配置文件 将以下代码复制进去 重启服务

[mongodb]

extension=php_mongodb.dll

输出phpinfo(); 看到mongodb则扩展成功

4f2ae1dcec3e796ca23ea3c28a93beed.png

三.Composer安装 mongodb/mongodb

根据mongodb版本下载对应的驱动

mongodb/mongodb驱动地址: https://packagist.org/packages/mongodb/mongodb

afe0ce783177613bcf68a5c4da8ccbbe.png

根据版本运行对应版本命令:

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

16d991f0c4b1aac9899a8f5f0a7bd1ef.png

如果你的是Wamp环境 那么坑来啦。

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

a4fc09d9ea3c21097481917da9ccd7c9.png

Composer是根据 php -m 查看当前php扩展 原因就来了MongoDB居然没有!!!

b6184e3a3f3ad5b48f5186654742f98f.png

原因:

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 将其存到关系型数据库中,根据业务需求而写。

8e08735f89fff0edbb14c822758fa400.png

//文件存放位置

efc4d917942bf906d4bc1b41f1635a5e.png

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值