前言:這種坑很深呀,要對應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