PHP操作MongoDB GridFS 存儲文件,如圖片文件

GridFS是MongoDB的一個內(nèi)置功能,它提供一組文件操作的API以利用MongoDB存儲文件元旬,GridFS的基本原理是將文件保存在兩個Collection中赃绊,一個保存文件索引既峡,一個保存文件內(nèi)容,文件內(nèi)容按一定大小分成若干塊碧查,每一塊存在一個Document中运敢,這種方法不僅提供了文件存儲,還提供了對文件相關(guān)的一些附加屬性(比如MD5值忠售,文件名等等)的存儲传惠。

01

02//

初始化gridfs

03$conn=newMongo();//

連接MongoDB

04$db=$conn->photos;//

選擇數(shù)據(jù)庫

05$collection=$db->getGridFS();//

取得gridfs對象

06

07//

gridfs有三種方式存儲文件

08//

第一種直接存儲文件

09$id=$collection->storeFile("./logo.png");

10

11//

第二種存儲文件二進(jìn)制流

12$data=

get_file_contents("./logo.png");

13$id=$collection->storeBytes($data,array("param"=>'附加參數(shù)將隨圖片一起存入'));

14

15//

第三種保存直接表單提交的文件$_FILES

16$id=$collection->storeUpload('upfile');

17//

相當(dāng)于

18$id=$collection->storeFile($_FILES['upfile']['tmp_name']);

19

20//--------------以上是保存圖片--下面開始讀取圖片----------------

21

22//

保存成功后返回$id = md5字符串

23$logo=$collection->findOne(array('_id'=>$id));//

以_id為索引取得文件

24header('Content-type:

image/png');//

輸出圖片頭

25echo$logo->getBytes();//

輸出數(shù)據(jù)流

26?>

特別備注:

通過$id = $collection->storeFile($_FILES['upfile']['tmp_name']);產(chǎn)生的ID,是MongoDB的ID對象稻扬,而不是一個字符串卦方!如以下格式:

1{

2"_id":

ObjectId("525418525ba8a18c1b000001"),

3"filename":"D:\\php\\xampp\\tmp\\php8116.tmp",

4"uploadDate":

ISODate("2013-10-08T14:36:02.0Z"),

5"length":

NumberInt(55862),

6"chunkSize":

NumberInt(262144),

7"md5":"a6f19f3434f0b36bb2611cd4c6d82b35"

8}

不過,我們可以通過$id = strval($id)泰佳,把上述ID對象字符串化盼砍,如可得到上述的525418525ba8a18c1b000001值,再把這個值存到MySQL數(shù)據(jù)庫中逝她,到時候可通過這個 字符串ID 作為條件衬廷,找到相應(yīng)的MongoDB資源。參考代碼如下:

1$conn=newMongo(C('127.0.0.1:27017'));//如果設(shè)置了密碼自己配置DSN

2$db=$conn->selectDB('edu_sns');//

選擇數(shù)據(jù)庫

3$collection=$db->getGridFS('zk_attach');//

選擇集合汽绢,相等于選擇數(shù)據(jù)表

4

5$id=$_GET['id'];

6$object=$collection->findOne(array('_id'=>newMongoId($id)));

7header('Content-type:

image/png');

8echo$object->getBytes();

最近因工作需要研究了下GridFS吗跋,并整理了個Demo出來。。分享一下經(jīng)驗跌宛。酗宋。

gfs.php文件

01

02//

連接Mongo并初始化GFS

03$conn=newMongo(C('127.0.0.1:27017'));//如果設(shè)置了密碼自己配置DSN

04$db=$conn->selectDB('edu_sns');//

選擇數(shù)據(jù)庫

05$collection=$db->getGridFS('zk_attach');//

選擇集合,相等于選擇數(shù)據(jù)表

06

07//

上傳圖片

08if(isset($_FILES['upfile']))

{

09

10//

保存新上傳的文件

11$size=$_FILES['upfile']['size'];

12$md5=

md5_file($_FILES['upfile']['tmp_name']);

13$exists=$collection->findOne(array('md5'=>$md5,'length'=>$size),array('md5'));

14if(empty($exists))

{

15$collection->storeUpload('upfile');

16

17//

或修改為如下代碼疆拘,并存入一些自定義參數(shù)

18/*

19$filename=$_FILES['upfile']['name'];

20$filetype=$_FILES['upfile']['type'];

21$tmpfilepath=$_FILES['upfile']['tmp_name'];

22$id=$gridfs->storeFile($tmpfilepath,

array('filename' => $filename, 'filetype' => $filetype));

23*/

24

25}else{

26unlink($_FILES['upfile']['tmp_name']);

27}

28echo"

圖片路徑為:

http://{$_SERVER['HTTP_HOST']}{$_SERVER['REQUEST_URI']}?img={$md5}";

29

30}elseif($id=$_GET['img'])

{//

生成圖片

31

32//

索引圖片文件

33$image=$collection->findOne(array('md5'=>$id));

34

35//

設(shè)定文檔類型蜕猫,顯示圖片

36$img_bytes=$image->getBytes();

37include_once'thumb.php';

38$w=is_numeric($_GET['w'])

?intval($_GET['w'])

: 100;

39Thumb::maxWidth($img_bytes,$w);

40

41}elseif($id=$_GET['del'])

{//

刪除圖片

42$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 圖像元數(shù)據(jù)

008*

@param float $w 最大寬度

009*/

010staticfunctionmaxWidth($im,$w)

{

011if(empty($im)

||empty($w)

|| !is_numeric($w))

{

012thrownewException("缺少必須的參數(shù)");

013}

014$im=

imagecreatefromstring($im);//

創(chuàng)建圖像

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 圖像元數(shù)據(jù)

035*

@param float $w 最大高度

036*/

037staticfunctionmaxHeight($im,$h)

{

038if(empty($im)

||empty($h)

|| !is_numeric($h))

{

039thrownewException("缺少必須的參數(shù)");

040}

041$im=

imagecreatefromstring($im);//

創(chuàng)建圖像

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 圖像元數(shù)據(jù)

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("缺少必須的參數(shù)");

068}

069$im=

imagecreatefromstring($im);//

創(chuàng)建圖像

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//

開始創(chuàng)建縮放后的圖像

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 圖像元數(shù)據(jù)

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市哎迄,隨后出現(xiàn)的幾起案子回右,更是在濱河造成了極大的恐慌,老刑警劉巖漱挚,帶你破解...
    沈念sama閱讀 219,110評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件翔烁,死亡現(xiàn)場離奇詭異,居然都是意外死亡旨涝,警方通過查閱死者的電腦和手機(jī)蹬屹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,443評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來白华,“玉大人慨默,你說我怎么就攤上這事』⌒龋” “怎么了厦取?”我有些...
    開封第一講書人閱讀 165,474評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長管搪。 經(jīng)常有香客問我虾攻,道長,這世上最難降的妖魔是什么抛蚤? 我笑而不...
    開封第一講書人閱讀 58,881評論 1 295
  • 正文 為了忘掉前任台谢,我火速辦了婚禮,結(jié)果婚禮上岁经,老公的妹妹穿的比我還像新娘朋沮。我一直安慰自己,他們只是感情好缀壤,可當(dāng)我...
    茶點故事閱讀 67,902評論 6 392
  • 文/花漫 我一把揭開白布樊拓。 她就那樣靜靜地躺著,像睡著了一般塘慕。 火紅的嫁衣襯著肌膚如雪筋夏。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,698評論 1 305
  • 那天图呢,我揣著相機(jī)與錄音条篷,去河邊找鬼骗随。 笑死,一個胖子當(dāng)著我的面吹牛赴叹,可吹牛的內(nèi)容都是我干的鸿染。 我是一名探鬼主播,決...
    沈念sama閱讀 40,418評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼乞巧,長吁一口氣:“原來是場噩夢啊……” “哼涨椒!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起绽媒,我...
    開封第一講書人閱讀 39,332評論 0 276
  • 序言:老撾萬榮一對情侶失蹤蚕冬,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后是辕,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體囤热,經(jīng)...
    沈念sama閱讀 45,796評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,968評論 3 337
  • 正文 我和宋清朗相戀三年免糕,在試婚紗的時候發(fā)現(xiàn)自己被綠了赢乓。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片忧侧。...
    茶點故事閱讀 40,110評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡石窑,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蚓炬,到底是詐尸還是另有隱情松逊,我是刑警寧澤,帶...
    沈念sama閱讀 35,792評論 5 346
  • 正文 年R本政府宣布肯夏,位于F島的核電站经宏,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏驯击。R本人自食惡果不足惜烁兰,卻給世界環(huán)境...
    茶點故事閱讀 41,455評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望徊都。 院中可真熱鬧沪斟,春花似錦、人聲如沸暇矫。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,003評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽李根。三九已至槽奕,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間房轿,已是汗流浹背粤攒。 一陣腳步聲響...
    開封第一講書人閱讀 33,130評論 1 272
  • 我被黑心中介騙來泰國打工所森, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人夯接。 一個月前我還...
    沈念sama閱讀 48,348評論 3 373
  • 正文 我出身青樓必峰,卻偏偏與公主長得像,于是被迫代替她去往敵國和親钻蹬。 傳聞我的和親對象是個殘疾皇子吼蚁,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,047評論 2 355

推薦閱讀更多精彩內(nèi)容

  • ¥開啟¥ 【iAPP實現(xiàn)進(jìn)入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個線程,因...
    小菜c閱讀 6,426評論 0 17
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理问欠,服務(wù)發(fā)現(xiàn)肝匆,斷路器,智...
    卡卡羅2017閱讀 134,662評論 18 139
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法顺献,類相關(guān)的語法旗国,內(nèi)部類的語法,繼承相關(guān)的語法注整,異常的語法能曾,線程的語...
    子非魚_t_閱讀 31,639評論 18 399
  • 昨夜 甲舍友:明天一二節(jié)居然沒課寿冕,真爽。 我信了 乙舍友:超哥椒袍,你居然信了驼唱。 我又信了 今天我起來了,沒課驹暑!我居然...
    archMHC閱讀 342評論 2 3
  • 其實作為一個應(yīng)屆畢業(yè)生优俘,才剛剛實習(xí)了半年的我京办,已經(jīng)有深深的感觸,我們畢業(yè)了帆焕,都想著向往著大的城市去發(fā)展惭婿,但并不是沒...
    鴛鴦袖里握兵符閱讀 236評論 0 1