|
前言:这种坑很深呀,要对应mongodb的版本跟php支持的版本,然后,如果要用composer安装第三方的库,一定要一一对应的
正片开始!
开发环境:
系统:window
开发语言:php+apache+tp5
一、window下安装mongodb:http://baijiahao.baidu.com/s?id=1601512248926547477&wfr=spider&for=pc
二、通过composer下载第三方库(封装一个类)
mongosStorage.php
<?php
/**
* Created by PhpStorm.
* User: gan
* Date: 2019/10/22
* Time: 14:58
*/
namespace app\common\lib; // 命名空间
class mongosStorage{
// 1、必须定义一个静态私有属性
// 2、定义一个私有构造方法
// 3、单例模式就是为了避免多次new同一个对象,形成统一路口
private static $obj = null;
private $collection = null;
private function __construct()
{
$this->collection = (new \MongoDB\Client)->storage->selectGridFSBucket();
}
public static function singleEntrance(){
// 判断对象是否已经实例化过
if(!self::$obj instanceof self){
self::$obj = new self(); // 如果没有就要实例化一下
}
return self::$obj;
}
// 防止外部克隆
public function __clone()
{
// TODO: Implement __clone() method.
}
/**
* @param $filename(仅仅是文件名,不需要路径)
* @param $filepath(绝对路径的文件)
*/
public function deposit($filename,$filepath){
$stream = $this->collection->openUploadStream($filename);
$contents = file_get_contents($filepath);
fwrite($stream, $contents);
fclose($stream);
}
/**
* 获取文件ID
* @param $filename (仅仅是文件名,不需要路径)
* @return mixed
*/
public function getFileId($filename = ''){
$stream = $this->collection->openDownloadStreamByName($filename);
$fileId = $this->collection->getFileIdForStream($stream);
return $fileId;
}
/**
* 取
* @param $filename (仅仅是文件名,不需要路径)
*/
public function take($filename = ''){
$stream = $this->collection->openDownloadStreamByName($filename, ['revision' => 0]);
return stream_get_contents($stream);
}
}
二、显示在html上
*由于我存入的时候,没有保存内容类型,所以,取的时候有点麻烦*
取出二进制图片后,通过php生成图片,html请求显示图片
图片操作控制器文件代码
<?php
/**
* FLY rms 图片操作控制器
* @author fly
* 2018-9-30 15:52:21
*/
namespace app\admin\controller;
use app\common\lib\mongosStorage;
use think\Controller;
use think\Request;
class Image extends Admin
{
//上传功能
public function upload(){
$return = array(
'msg'=>'fall',
'code'=>201,
'mongodb_id'=>'',
'filename'=>'',
);
try {
// 移动到框架应用根目录/public/uploads/ 目录下
$file = request()->file('image');
$file_name = '';
$mongodb_id = '';
if($file){
$root_path = __DIR__."/../../../public/uploads/temporaryFile/";
//不同模块保存不同的文件
if (!is_dir($root_path)) {
mkdir($root_path,0777,true);
}
$savename = date('YmdHis') . rand(10000, 99999);
$info = $file->move($root_path,$savename);
if($info){
$file_name = $info->getFilename();
$obj = mongosStorage::singleEntrance();
$obj->deposit($file_name,$root_path.$file_name);
$mongodb_id = $obj->getFileId($file_name);
unset($info); // 网上查是tp5才会这样
@unlink($root_path.$file_name); // 删除临时文件
}else{
throw new \Exception($file->getError());
}
}
$return['code'] = 200;
$return['msg'] = "success";
$return['mongodb_id'] = $mongodb_id;
$return['filename'] = $file_name;
} catch (\Exception $e) {
$return['msg'] = $e->getMessage();
}
die(json_encode($return));
}
/**
* 获取图片
*/
public function getImage(){
header("Content-Type:image/png");
$file_name = input('file_name');
if($file_name){
$obj = mongosStorage::singleEntrance();
$file = $obj->take($file_name);
echo $file;
}
}
}
模板文件代码
<div class="layui-form-item">
<img src="{:url('/admin/Image/getImage',['file_name'=>'2019102416593634834.jpg'])}"/>
</div>
三、显示结果
由于是测试,所以,没有做什么样式处理,但是,自测是可行的
能用到的网址:
window下mongodb下载网址:https://www.mongodb.org/dl/win32/x86_64-2008plus-ssl?_ga=2.30821752.638885743.1535763516-1240051369.1535763516
mongo文档:https://docs.mongodb.com/ecosystem/drivers/php/
composer安装第三方库说明:https://github.com/mongodb/mongo-php-library/releases
来源:https://www.cnblogs.com/FLy-1992/p/11737208.html |