mongodb实现文件存储系统

Posted FcLwYf

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

以上是关于mongodb实现文件存储系统的主要内容,如果未能解决你的问题,请参考以下文章

MongoDB GridFS

MongoDB GridFS

MongoDB

MongodbGFS存储大文件(java版)

MongoDB--GridFS 文件存储系统

Doctrine 2 ODM MongoDB 从内存中将图像存储在 GridFS 中