GridFS是MongoDB的一個內置功能,它提供一組文件操作的API以利用MongoDB存儲文件,GridFS的基本原理是將文件保存在兩個Collection中,一個保存文件索引,一個保存文件內容,文件內容按一定大小分成若干塊,每一塊存在一個Document中,這種方法不僅提供了文件存儲,還提供了對文件相關的一些附加屬性(比如MD5值,文件名等等)的存儲。
初始化gridfs
$conn=newMongo();//連接MongoDB
$db=$conn->photos;//選擇數據庫
$collection=$db->getGridFS();//取得gridfs對象
gridfs有三種方式存儲文件
第一種直接存儲文件
$id=$collection->storeFile("./logo.png");
第二種存儲文件二進制流
$data=get\_file\_contents("./logo.png");
$id=$collection->storeBytes($data,array("param"=>'附加參數將隨圖片一起存入'));
第三種保存直接表單提交的文件$\_FILES
$id=$collection->storeUpload('upfile');
相當于
$id=$collection->storeFile($\_FILES\['upfile'\]\['tmp\_name'\]);
//--------------以上是保存圖片--下面開始讀取圖片----------------
保存成功后返回$id = md5字符串
$logo=$collection->findOne(array('\_id'=>$id));//
以\_id為索引取得文件
header('Content-type:image/png');//輸出圖片頭
echo$logo->getBytes();//輸出數據流
?>
**特別備注:**
通過$id = $collection->storeFile($\_FILES\['upfile'\]\['tmp\_name'\]);產生的ID,是MongoDB的ID對象,而不是一個字符串!如以下格式:
{
"\_id":
ObjectId("525418525ba8a18c1b000001"),
"filename":"D:\\\\php\\\\xampp\\\\tmp\\\\php8116.tmp",
"uploadDate":
ISODate("2013-10-08T14:36:02.0Z"),
"length":
NumberInt(55862),
"chunkSize":
NumberInt(262144),
"md5":"a6f19f3434f0b36bb2611cd4c6d82b35"
}
不過,我們可以通過$id = strval($id),把上述ID對象字符串化,如可得到上述的525418525ba8a18c1b000001值,再把這個值存到MySQL數據庫中,到時候可通過這個 字符串ID 作為條件,找到相應的MongoDB資源。參考代碼如下:
$conn=newMongo(C('127.0.0.1:27017'));//如果設置了密碼自己配置DSN
$db=$conn->selectDB('edu\_sns');//
選擇數據庫
$collection=$db->getGridFS('zk\_attach');//選擇集合,相等于選擇數據表
$id=$\_GET\['id'\];
$object=$collection->findOne(array('\_id'=>newMongoId($id)));
header('Content-type:image/png');
echo$object->getBytes();
**最近因工作需要研究了下GridFS,并整理了個Demo出來。。分享一下經驗。。**
**gfs.php文件**
//連接Mongo并初始化GFS
$conn=newMongo(C('127.0.0.1:27017'));//如果設置了密碼自己配置DSN
$db=$conn->selectDB('edu\_sns');//選擇數據庫
$collection=$db->getGridFS('zk\_attach');//選擇集合,相等于選擇數據表
//上傳圖片
if(isset($\_FILES\['upfile'\]))
{
保存新上傳的文件
$size=$\_FILES\['upfile'\]\['size'\];
$md5=
md5\_file($\_FILES\['upfile'\]\['tmp\_name'\]);
$exists=$collection->findOne(array('md5'=>$md5,'length'=>$size),array('md5'));
if(empty($exists))
{
15$collection->storeUpload('upfile');
//或修改為如下代碼,并存入一些自定義參數
/\*
$filename=$\_FILES\['upfile'\]\['name'\];
$filetype=$\_FILES\['upfile'\]\['type'\];
$tmpfilepath=$\_FILES\['upfile'\]\['tmp\_name'\];
$id=$gridfs->storeFile($tmpfilepath,
array('filename' => $filename, 'filetype' => $filetype));
\*/
}else{
unlink($\_FILES\['upfile'\]\['tmp\_name'\]);
}
echo"
圖片路徑為:
http://{$\_SERVER\['HTTP\_HOST'\]}{$\_SERVER\['REQUEST\_URI'\]}?img={$md5}";
}elseif($id=$\_GET\['img'\])
{
//生成圖片
//索引圖片文件
$image=$collection->findOne(array('md5'=>$id));
//設定文檔類型,顯示圖片
$img\_bytes=$image->getBytes();
include\_once'thumb.php';
$w=is\_numeric($\_GET\['w'\]) ?intval($\_GET\['w'\]): 100;
Thumb::maxWidth($img\_bytes,$w);
}elseif($id=$\_GET\['del'\])
{//刪除圖片
$s=$collection->remove(array('md5'=>$id));
43header('Location:'.$\_SERVER\['HTTP\_REFERER'\]);
44
45}else{//
圖片列表
46$cursor=$collection->find();
47foreach($cursoras$obj)
:
48echo'
href="?img='.$obj->file\['md5'\]
.'&w=800">
src="?img='.$obj->file\['md5'\]
.'"
border="0" />
.'">刪除';
49endforeach
50;
51}
52?>
**thumb.php 縮略圖文件**
001
002classThumb
{
003
004/\*\*
005\*
以最大寬度縮放圖像
006\*
007\*
@param string $im 圖像元數據
008\*
@param float $w 最大寬度
009\*/
010staticfunctionmaxWidth($im,$w)
{
011if(empty($im)
||empty($w)
|| !is\_numeric($w))
{
012thrownewException("缺少必須的參數");
013}
014$im=
imagecreatefromstring($im);//
創建圖像
015list
($im\_w,$im\_h)
\= self::getsize($im);//
獲取圖像寬高
016if($im\_w>$w)
{
017$new\_w=$w;
018$new\_h=$w/$im\_w\*$im\_h;
019}else{
020$new\_w=$im\_w;
021$new\_h=$im\_h;
022}
023$dst\_im=
imagecreatetruecolor($new\_w,$new\_h);
024imagecopyresampled($dst\_im,$im,
0, 0, 0, 0,$new\_w,$new\_h,$im\_w,$im\_h);
025header('Content-type:image/jpeg');
026imagepng($dst\_im);
027imagedestroy($dst\_im);
028imagedestroy($im);
029}
030
031/\*\*
032\*
以最大高度縮放圖像
033\*
034\*
@param string $im 圖像元數據
035\*
@param float $w 最大高度
036\*/
037staticfunctionmaxHeight($im,$h)
{
038if(empty($im)
||empty($h)
|| !is\_numeric($h))
{
039thrownewException("缺少必須的參數");
040}
041$im=
imagecreatefromstring($im);//
創建圖像
042list
($im\_w,$im\_h)
\= self::getsize($im);//
獲取圖像寬高
043if($im\_h>$h)
{
044$new\_w=$h/$im\_h\*$im\_w;
045$new\_h=$h;
046}else{
047$new\_w=$im\_w;
048$new\_h=$im\_h;
049}
050$dst\_im=
imagecreatetruecolor($new\_w,$new\_h);
051imagecopyresampled($dst\_im,$im,
0, 0, 0, 0,$new\_w,$new\_h,$im\_w,$im\_h);
052header('Content-type:image/jpeg');
053imagepng($dst\_im);
054imagedestroy($dst\_im);
055imagedestroy($im);
056}
057
058/\*\*
059\*
生成固定大小的圖像并按比例縮放
060\*
061\*
@param string $im 圖像元數據
062\*
@param float $w 最大寬度
063\*
@param float $h 最大高度
064\*/
065staticfunctionfixed($im,$w,$h)
{
066if(empty($im)
||empty($w)
||empty($h)
|| !is\_numeric($w)
|| !is\_numeric($h))
{
067thrownewException("缺少必須的參數");
068}
069$im=
imagecreatefromstring($im);//
創建圖像
070list
($im\_w,$im\_h)
\= self::getsize($im);//
獲取圖像寬高
071if($im\_w>$im\_h||$w<$h)
{
072$new\_h=intval(($w/$im\_w)
\*$im\_h);
073$new\_w=$w;
074}else{
075$new\_h=$h;
076$new\_w=intval(($h/$im\_h)
\*$im\_w);
077}
078//echo
"$im\_w x $im\_h
$new\_w x $new\_h
$x $y";exit;
079//
開始創建縮放后的圖像
080$dst\_im=
imagecreatetruecolor($new\_w,$new\_h);
081imagecopyresampled($dst\_im,$im,
0, 0, 0, 0,$new\_w,$new\_h,$im\_w,$im\_h);
082header('Content-type:image/jpeg');
083imagepng($dst\_im);
084imagedestroy($dst\_im);
085imagedestroy($im);
086}
087
088/\*
089\*
獲取圖像大小
090\*
091\*
@param string $im 圖像元數據
092\*
@return array
093\*/
094protectedstaticfunctiongetsize($im)
{
095returnarray(
096imagesx($im),
097imagesy($im)
098);
099}
100}
101?>
**index.html HTML表單文件**
01
html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
02
03
04
charset=utf-8"/>
05Mongo
Gridfs
06
07
08
09
10
11
查看圖片
12
13
14
- 技能知識點
- 對死鎖問題的理解
- 文件系統原理:如何用1分鐘遍歷一個100TB的文件?
- 數據庫原理:為什么PrepareStatement性能更好更安全?
- Java Web程序的運行時環境到底是怎樣的?
- 你真的知道自己要解決的問題是什么嗎?
- 如何解決問題
- 經驗分享
- GIT的HTTP方式免密pull、push
- 使用xhprof對php7程序進行性能分析
- 微信掃碼登錄和使用公眾號方式進行掃碼登錄
- 關于curl跳轉抓取
- Linux 下配置 Git 操作免登錄 ssh 公鑰
- Linux Memcached 安裝
- php7安裝3.4版本的phalcon擴展
- centos7下php7.0.x安裝phalcon框架
- 將字符串按照指定長度分割
- 搜索html源碼中標簽包的純文本
- 更換composer鏡像源為阿里云
- mac 隱藏文件顯示/隱藏
- 谷歌(google)世界各國網址大全
- 實戰文檔
- PHP7安裝intl擴展和linux安裝icu
- linux編譯安裝時常見錯誤解決辦法
- linux刪除文件后不釋放磁盤空間解決方法
- PHP開啟異步多線程執行腳本
- file_exists(): open_basedir restriction in effect. File完美解決方案
- PHP 7.1 安裝 ssh2 擴展,用于PHP進行ssh連接
- php命令行加載的php.ini
- linux文件實時同步
- linux下php的psr.so擴展源碼安裝
- php將字符串中的\n變成真正的換行符?
- PHP7 下安裝 memcache 和 memcached 擴展
- PHP 高級面試題 - 如果沒有 mb 系列函數,如何切割多字節字符串
- PHP設置腳本最大執行時間的三種方法
- 升級Php 7.4帶來的兩個大坑
- 不同域名的iframe下,fckeditor在chrome下的SecurityError,解決辦法~~
- Linux find+rm -rf 執行組合刪除
- 從零搭建Prometheus監控報警系統
- Bug之group_concat默認長度限制
- PHP生成的XML顯示無效的Char值27消息(PHP generated XML shows invalid Char value 27 message)
- XML 解析中,如何排除控制字符
- PHP各種時間獲取
- nginx配置移動自適應跳轉
- 已安裝nginx動態添加模塊
- auto_prepend_file與auto_append_file使用方法
- 利用nginx實現web頁面插入統計代碼
- Nginx中的rewrite指令(break,last,redirect,permanent)
- nginx 中 index try_files location 這三個配置項的作用
- linux安裝git服務器
- PHP 中運用 elasticsearch
- PHP解析Mysql Binlog
- 好用的PHP學習網(持續更新中)
- 一篇寫給準備升級PHP7的小伙伴的文章
- linux 安裝php7 -系統centos7
- Linux 下多php 版本共存安裝
- PHP編譯安裝時常見錯誤解決辦法,php編譯常見錯誤
- nginx upstream模塊--負載均衡
- 如何解決Tomcat服務器打開不了HOST Manager的問題
- PHP的內存泄露問題與垃圾回收
- Redis數據結構 - string字符串
- PHP開發api接口安全驗證
- 服務接口API限流 Rate Limit
- php內核分析---內存管理(一)
- PHP內存泄漏問題解析
- 【代碼片-1】 MongoDB與PHP -- 高級查詢
- 【代碼片-1】 php7 mongoDB 簡單封裝
- php與mysql系統中出現大量數據庫sleep的空連接問題分析
- 解決crond引發大量sendmail、postdrop進程問題
- PHP操作MongoDB GridFS 存儲文件,如圖片文件
- 淺談php安全
- linux上keepalived+nginx實現高可用web負載均衡
- 整理php防注入和XSS攻擊通用過濾