mongodb實現文件存儲系統

前言:這種坑很深呀,要對應mongodb的版本跟php支持的版本,而後,若是要用composer安裝第三方的庫,必定要一一對應的php

 

 

 

 

正片開始!html

 

開發環境:git

系統:windowgithub

開發語言:php+apache+tp5mongodb

 

1、window下安裝mongodb:http://baijiahao.baidu.com/s?id=1601512248926547477&wfr=spider&for=pcapache

2、經過composer下載第三方庫(封裝一個類)json

mongosStorage.phpapp

<?php
/**
 * Created by PhpStorm.
 * User: gan
 * Date: 2019/10/22
 * Time: 14:58
 */
namespace app\common\lib; // 命名空間
class mongosStorage{

    // 一、必須定義一個靜態私有屬性
    // 二、定義一個私有構造方法
    // 三、單例模式就是爲了不屢次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);
    }

}

 

2、顯示在html上composer

 

 

 

*因爲我存入的時候,沒有保存內容類型,因此,取的時候有點麻煩*框架

取出二進制圖片後,經過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>

3、顯示結果

 

 

 

因爲是測試,因此,沒有作什麼樣式處理,可是,自測是可行的

 

能用到的網址:

 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

相關文章
相關標籤/搜索