mongodb实现文件存储系统

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

时间: 2024-11-08 21:31:20

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

MongoDB 数据文件备份与恢复

备份与恢复数据对于管理任何数据存储系统来说都是非常重要的. 1.冷备份与恢复——创建数据文件的副本(前提是要停止MongoDB服务器),也就是直接copy MongoDB将所有数据都存储在数据目录下,默认是/data/db/(Windows下是C:\data\db\),启动MongoDB时也可以用--dbpath指定我们自己设置的数据存储目录. 备份MongoDB数据:只要简单的创建数据存储目录的副本就可以了,直接copy一份. 恢复MongoDB数据:在MongoDB启动时用--dbpath指

MongoDB数据文件内部结构

有人在Quora上提问:MongoDB数据文件内部的组织结构是什么样的.随后10gen的工程师Jared Rosoff出来做了简短的回答. 每一个数据库都有自己独立的文件.如果你开启了directoryperdb选项,那你每个库的文件会单独放在一个文件夹里. 数据库文件在内部会被切分成单个的块,每个块只保存一个名字空间的数据.在MongoDB中,名字空间用于区分不同的存储类别.比如每个collection有一个独立的名字空间,每个索引也有自己的名字空间. 在一个块中,会保存多条记录,每条记录是B

Tahoe-LAFS 开源分布式文件存储系统

很多技术信息来自于英文页面,我英文不好,可能有错漏的地方. Tahoe-LAFS是一个分布式的文件存储系统.它的特点是无法对内容进行审查,即使是存储服务提供方:极高的安全性,用长不定字符串链接替文件访问权限验证,基本不可能被在线破解:匿名,无注册及身份验证,只靠第一次运行时分配的随机码区分不同用户. 简单说下它的文件存储流程.我通过客户端上传一个文件.文件经过加密被切分成数个片段,上传到数个存储服务器.每个服务器只保存文件的一部分,不保存完整的文件.并且忽略掉文件名,用一串加密过的字符代替.上传

MongoDB下载文件 百度盘共享

1> mongodb下载地址: http://www.mongodb.org/downloads 官方下载不了,可以到百度共享盘里面下载 MongoDB 2.6.5 Windows 64位:  http://pan.baidu.com/s/1qW0nCpI Windows 32位:http://pan.baidu.com/s/1qWmG2NM Linux 64位: http://pan.baidu.com/s/1CRxzo 转自:http://mongoing.com/mongodb-downl

使用Mtools分析MongoDB日志文件

一 Mtools介绍 mtools是一组用来解析和过滤MongoDB日志文件的脚本.mtools包括以下几个工具: mlogfilter    可以根据时间切割日志文件,过滤慢查询等 mloginfo      返回日志文件信息,比如开始和结束时间等 mplotqueries   对日志文件进行视图展现 mlogvis      创建一个自定义html文件交互式展现 mlaunch      快速搭建本地测试环境,包括复制集合分片系统 mtools是用python写的,需要python2.6或者

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

汉澳sinox2014可以用比较小的固态硬盘安装,文件系统可以用zfs系统存放. 请准备一些硬盘,比如三块SCSI硬盘:da0,da1,da2 现在开始 增加如下一行内容到你的/etc/rc.conf里面 # echo 'zfs_enable="YES"' >> /etc/rc.conf 使用raidz1创建一个zpool,命名为tank # zpool create tank raidz da0 da1 da2 此时,这个zpool会被自动挂接到 /tank,并且我们可以

MongoDB索引文件破坏后导致查询错误的问题

问题描述: MongoDB在非正常情况下关闭时,可能会导致索引文件破坏,造成数据在更新时没有反映到索引上. 解决方案: 使用脚本,重建MongoDB所有表的索引. var names  = db.getCollectionNames(); for( var i in names ){     var name = names[i];     print(name);          var coll = db.getCollection(name);     coll.reIndex(); }

MongoDB数据库文件损坏恢复数据全过程

一.故障描述 客户设备环境为一台操作系统为Windows Server 2008的服务器,部署MongoDB数据库.由于业务需要,客户在未关闭MongoDB数据库服务的情况下,对数据库文件进行了拷贝.将数据库文件拷贝到其他分区后,客户对原数据库分区进行了格式化操作,后将数据库文件拷回原分区,重新启动MongoDB服务,这时,客户发现服务无法启动.报错如下:图一: 二.故障检测 一般来说,在服务没有关闭的情况下,直接对MongoDB数据库文件进行拷贝,由于服务还在运行,会导致mongod.lock

分布式文件存储系统--fastDFS

分布式文件系统,它是一款开源的轻量级分布式系统 单机时代 初创时期由于时间紧迫,在各种资源有限的情况下,通常就直接在项目目录下建立静态文件夹,用于用户存放项目中的文件资源.如果按不同类型再细分,可以在项目目录下再建立不同的子目录来区分.例如: resources\static\file. resources\static\img等. 优点:这样做比较便利,项目直接引用就行,实现起来也简单,无需任何复杂技术,保存数据库记录和访问起来也很方便. 缺点:如果只是后台系统的使用一般也不会有什么问题,但是