PHP操作MongoDB GridFS 存储文件,如图片文件

GridFS是MongoDB的一个内置功能,它提供一组文件操作的API以利用MongoDB存储文件,GridFS的基本原理是将文件保存在两个Collection中,一个保存文件索引,一个保存文件内容,文件内容按一定大小分成若干块,每一块存在一个Document中,这种方法不仅提供了文件存储,还提供了对文件相关的一些附加属性(比如MD5值,文件名等等)的存储。

01

02//

初始化gridfs

03$conn=newMongo();//

连接MongoDB

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

选择数据库

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

取得gridfs对象

06

07//

gridfs有三种方式存储文件

08//

第一种直接存储文件

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

10

11//

第二种存储文件二进制流

12$data=

get_file_contents("./logo.png");

13$id=$collection->storeBytes($data,array("param"=>'附加参数将随图片一起存入'));

14

15//

第三种保存直接表单提交的文件$_FILES

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

17//

相当于

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();//

输出数据流

26?>

特别备注:

通过$id = $collection->storeFile($_FILES['upfile']['tmp_name']);产生的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数据库中,到时候可通过这个 字符串ID 作为条件,找到相应的MongoDB资源。参考代码如下:

1$conn=newMongo(C('127.0.0.1:27017'));//如果设置了密码自己配置DSN

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

选择数据库

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

选择集合,相等于选择数据表

4

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

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

7header('Content-type:

image/png');

8echo$object->getBytes();

最近因工作需要研究了下GridFS,并整理了个Demo出来。。分享一下经验。。

gfs.php文件

01

02//

连接Mongo并初始化GFS

03$conn=newMongo(C('127.0.0.1:27017'));//如果设置了密码自己配置DSN

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

选择数据库

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

选择集合,相等于选择数据表

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

或修改为如下代码,并存入一些自定义参数

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

设定文档类型,显示图片

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 图像元数据

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容

  • ¥开启¥ 【iAPP实现进入界面执行逐一显】 〖2017-08-25 15:22:14〗 《//首先开一个线程,因...
    小菜c阅读 6,350评论 0 17
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,587评论 18 139
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,560评论 18 399
  • 昨夜 甲舍友:明天一二节居然没课,真爽。 我信了 乙舍友:超哥,你居然信了。 我又信了 今天我起来了,没课!我居然...
    archMHC阅读 339评论 2 3
  • 其实作为一个应届毕业生,才刚刚实习了半年的我,已经有深深的感触,我们毕业了,都想着向往着大的城市去发展,但并不是没...
    鸳鸯袖里握兵符阅读 224评论 0 1