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实现文件存储系统的主要内容,如果未能解决你的问题,请参考以下文章