zoukankan      html  css  js  c++  java
  • 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 appcommonlib; // 命名空间
    class mongosStorage{
    
        // 1、必须定义一个静态私有属性
        // 2、定义一个私有构造方法
        // 3、单例模式就是为了避免多次new同一个对象,形成统一路口
        private static $obj = null;
        private $collection = null;
        private function __construct()
        {
            $this->collection = (new MongoDBClient)->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 appadmincontroller;
    use appcommonlibmongosStorage;
    use thinkController;
    use thinkRequest;
    
    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

  • 相关阅读:
    js中用setTimeout写定时炸弹
    javascript函数的形参和实参
    在Mac OS X中配置Apache+PHP+MySQL(转)
    600多万用户密码使用次数统计分析程序
    pgsql数据库创建以及压缩包形式导入导出
    apache中的.htaccess配置示例收集整理
    收集常用的正则表达式及其应用
    采用htpasswd设置验证机制
    用apache做代理时候,可设置请求头信息
    ubuntu在混合环境中创建和配置文件共享
  • 原文地址:https://www.cnblogs.com/FLy-1992/p/11737208.html
Copyright © 2011-2022 走看看