首先说明一下:百度查询搜索的这些信息都是老本报版本的了不管用了
百度一下都是直接调用getGridFS这个方法。我的推测是:这个方法应该是几年前的老版本的扩展了或者驱动。对于目前的一些新版本是没有此方法可以直接调用GridFS对象了。
讲解流程:
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
你可以通过点击 “Custom(自定义)” 按钮来设置你的安装目录。
下一步安装 “install mongoDB compass” 不勾选,否则可能要很长时间都一直在执行安装。
安装成功后:
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
注:cmd不要关闭,关闭后则是关闭服务
3.添加环境变量
打开一个新的cmd运行命令 mongo
即可操作mongodb
注:新版本需添加用户权限(百度一下挺多的)
另外推荐看看这里的安装与运行(老版本的)http://www.runoob.com/mongodb/mongodb-tutorial.html
Navicat for MongoDB管理工具也蛮不错的。可以下载试用一下,链接mongodb
二.安装PHP扩展
1.下载扩展 https://pecl.php.net/package/mongodb 下载对应版本
将下载好的解压将php_mongodb.dll 复制到目前环境php版本下的ext文件中
[mongodb]
extension=php_mongodb.dll
输出phpinfo(); 看到mongodb则扩展成功
三.Composer安装 mongodb/mongodb
根据mongodb版本下载对应的驱动
mongodb/mongodb驱动地址: https://packagist.org/packages/mongodb/mongodb
根据版本运行对应版本命令:
composer require mongodb/mongodb v1.4.x-dev
提示:mongodb扩展未找到,可是phpinfo里mongodb扩展是存在的
Composer是根据 php -m 查看当前php扩展 原因就来了MongoDB居然没有!!!
原因:
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 将其存到关系型数据库中,根据业务需求而写。
//文件存放位置
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