前言:这种坑很深呀,要对应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

mongodb实现文件存储系统的更多相关文章

  1. 淘宝分布式文件存储系统:TFS

    TFS ——分布式文件存储系统 TFS(Taobao File System)是淘宝针对海量非结构化数据存储设计的分布式系统,构筑在普通的Linux机器集群上,可为外部提供高可靠和高并发的存储访问. ...

  2. MongoDB下载文件 百度盘共享

    1> mongodb下载地址: http://www.mongodb.org/downloads 官方下载不了,可以到百度共享盘里面下载 MongoDB 2.6.5 Windows 64位:   ...

  3. mongodb数据文件内部结构

    有人在Quora上提问:MongoDB数据文件内部的组织结构是什么样的.随后10gen的工程师Jared Rosoff出来做了简短的回答. 每一个数据库都有自己独立的文件.如果你开启了director ...

  4. 在汉澳sinox2014建立ZFS高可靠文件存储系统

    在汉澳sinox2014建立ZFS高可靠文件存储系统 汉澳sinox2014能够用比較小的固态硬盘安装,文件系统能够用zfs系统存放. 请准备一些硬盘,比方三块SCSI硬盘:da0,da1,da2 如 ...

  5. mongodb操作文件

    mongodb操作文件,主要是通过GridFS类.存储文件主要存放在fs中,其中的fs是数据库默认的.并且GridFS是直接与数据库打交道,与collection集合无关. ============= ...

  6. MongoDB日志文件过大

    MongoDB日志文件过大 MongoDB启动的时候指定了--logpath为一个日志文件.随着时间此文件会变得越来越大,达到好几个G. 因为不想让MongoDB进程重新启动,所以不能停止进程删除此文 ...

  7. 一图看懂hadoop分布式文件存储系统HDFS工作原理

    一图看懂hadoop分布式文件存储系统HDFS工作原理

  8. mongoDB数据库文件路径和数据操作

    1.查看MongoDB在电脑上的安装路径 which mongod 2.默认mongodb 数据文件是放到根目录 data/db 文件夹下,如果没有这个文件,需要自行创建 mkdir -p /data ...

  9. 用asp.net core结合fastdfs打造分布式文件存储系统

    最近被安排开发文件存储微服务,要求是能够通过配置来无缝切换我们公司内部研发的文件存储系统,FastDFS,MongDb GridFS,阿里云OSS,腾讯云OSS等.根据任务紧急度暂时先完成了通过配置来 ...

随机推荐

  1. Java学习笔记 DbUtils数据库查询和log4j日志输出 使用

    DbUtils使用 QueryRunner DbUtils中定义了一个数据库操作类QueryRunner,所有的数据库操作CRUD都是通过此类来完成. 此类是线程安全的 方法名 对应sql语句 exc ...

  2. Google_PWA_ServiceWork_渐进式 Web 应用_给应用提供离线体验

    前言:今天结识了google PWA提供的一个对移动端Web应用提供离线体验的一个功能,感觉很有用.我这里不分享自己的写法和代码.官网文档说的很详细,直接粘过来大家看吧. 推荐官网地址:你的第一个渐进 ...

  3. 微信小程序初体验遇到的坑

    今天,2017年1月9日凌晨,微信小程序如约上线.2007年1月9日,整整10年前的今天,苹果的iPhone手机正式问世! 经不起新技术的诱惑了,想试着开发一下看看.刚开始遇到很多坑,在这里记录一下, ...

  4. hook declined to update refs/heads/dev

    提交一个项目,push的时候,报错: warning: Large files detected. remote: error: File TaodangpuAuction/TaodangpuAuct ...

  5. ABP进阶教程3 - 优化编辑

    点这里进入ABP进阶教程目录 我们尝试在新增/编辑界面增加一个下拉框用来代替输入框编辑Status 添加实体 打开领域层(即JD.CRS.Core)的Entitys目录 //用以存放实体对象添加一个类 ...

  6. Mysql 索引精讲

    Mysql 索引精讲 开门见山,直接上图,下面的思维导图即是现在要讲的内容,可以先有个印象- 常见索引类型(实现层面) 索引种类(应用层面) 聚簇索引与非聚簇索引 覆盖索引 最佳索引使用策略 1.常见 ...

  7. ESP8266与ESP8285开发时有什么区别

    ESP8266模块在WiFi联网领域已经被广泛使用,但是ESP8266芯片是需要外挂Flash芯片的,这样就使模块不能做的更小.之后乐鑫公司又推出了ESP8285芯片,直接集成了1MByte的Flas ...

  8. python生产者和消费者模式实现(二)多进程方式

    import timeimport randomfrom multiprocessing import Process, Queue # 生产者def producer(q, i): food = ' ...

  9. SRDC - ORA-1555: Query Duration 0: Checklist of Evidence to Supply (Doc ID 1682704.1)

    SRDC - ORA-1555: Query Duration 0: Checklist of Evidence to Supply (Doc ID 1682704.1) Action Plan 1. ...

  10. Docker Harbor

    简介: Harbor是一个用于存储Docker镜像的企业级Registry服务:本章将介绍如何搭建Harbor Registry! Github官方安装文档: https://github.com/g ...