PHP mongoDB GridFS 图片存储系统

本帖最后由 tmkook 于 2011-11-8 23:53 编辑

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

gfs.php文件
  1. <?php   
  2. //连接Mongo并初始化GFS
  3. $conn = new Mongo();//如果设置了密码自己配置DSN
  4. $db = $conn->photos;
  5. $grid = $db->getGridFS();

  6. //上传图片
  7. if(isset($_FILES['upfile'])){
  8.         //保存新上传的文件
  9.         $size = $_FILES['upfile']['size'];
  10.         $md5 = md5_file($_FILES['upfile']['tmp_name']);
  11.         $exists = $grid->findOne(array('md5'=>$md5,'length'=>$size),array('md5'));
  12.         if(empty($exists)){
  13.                 $grid->storeUpload('upfile');
  14.         }else{
  15.                 unlink($_FILES['upfile']['tmp_name']);
  16.         }
  17.         echo "<p>图片路径为: <font color=red>http://{$_SERVER['HTTP_HOST']}{$_SERVER['REQUEST_URI']}?img={$md5}</font></p>";

  18. //生成图片
  19. }elseif($id = $_GET['img']){
  20.         //索引图片文件
  21.         $grid = $db->getGridFS();
  22.         $image = $grid->findOne(array('md5'=>$id));
  23.         //设定文档类型,显示图片
  24.         $img_bytes = $image->getBytes();
  25.         include_once 'thumb.php';
  26.         $w = is_numeric($_GET['w'])? intval($_GET['w']) : 100;
  27.         Thumb::maxWidth($img_bytes,$w);

  28. }elseif($id = $_GET['del']){
  29.         $s = $grid->remove(array('md5'=>$id));
  30.         header('Location:'.$_SERVER['HTTP_REFERER']);

  31. //图片列表
  32. }else{
  33.         //显示列表
  34.         $cursor = $grid->find();
  35.         foreach ($cursor as $obj):
  36.         echo '<p><a href="?img='.$obj->file['md5'].'&w=800"><img src="?img='.$obj->file['md5'].'" border="0" /></a><a href="?del='.$obj->file['md5'].'">删除</a></p>';
  37.         endforeach;
  38. }
复制代码


thumb.php 缩略图文件
  1. <?php
  2. class Thumb
  3. {
  4.         /**
  5.         * 以最大宽度缩放图像
  6.         * @param string  $im 图像元数据
  7.         * @param float $w 最大宽度
  8.         */
  9.         static function maxWidth($im,$w){
  10.                 if(empty($im) ||  empty($w) || !is_numeric($w)){
  11.                         throw new Exception("缺少必须的参数");
  12.                 }
  13.                 $im = imagecreatefromstring($im); //创建图像
  14.                 list($im_w,$im_h) = self::getsize($im); //获取图像宽高
  15.                 if($im_w > $w){
  16.                         $new_w = $w;
  17.                         $new_h = $w / $im_w * $im_h;
  18.                 }else{
  19.                         $new_w = $im_w;
  20.                         $new_h = $im_h;
  21.                 }
  22.                 $dst_im = imagecreatetruecolor($new_w,$new_h);
  23.                 imagecopyresampled($dst_im,$im,0,0,0,0,$new_w,$new_h,$im_w,$im_h);
  24.                 header('Content-type:image/jpeg');
  25.                 imagepng($dst_im);
  26.                 imagedestroy($dst_im);imagedestroy($im);
  27.         }

  28.         /**
  29.         * 以最大高度缩放图像
  30.         * @param string  $im 图像元数据
  31.         * @param float $w 最大高度
  32.         */
  33.         static function maxHeight($im,$h){
  34.                 if(empty($im) ||  empty($h) || !is_numeric($h)){
  35.                         throw new Exception("缺少必须的参数");
  36.                 }
  37.                 $im = imagecreatefromstring($im); //创建图像
  38.                 list($im_w,$im_h) = self::getsize($im); //获取图像宽高
  39.                 if($im_h > $h){
  40.                         $new_w = $h / $im_h * $im_w;
  41.                         $new_h = $h;
  42.                 }else{
  43.                         $new_w = $im_w;
  44.                         $new_h = $im_h;
  45.                 }
  46.                 $dst_im = imagecreatetruecolor($new_w,$new_h);
  47.                 imagecopyresampled($dst_im,$im,0,0,0,0,$new_w,$new_h,$im_w,$im_h);
  48.                 header('Content-type:image/jpeg');
  49.                 imagepng($dst_im);
  50.                 imagedestroy($dst_im);imagedestroy($im);
  51.         }

  52.         /**
  53.         * 生成固定大小的图像并按比例缩放
  54.         * @param string  $im 图像元数据
  55.         * @param float $w 最大宽度
  56.         * @param float $h 最大高度
  57.         */
  58.         static function fixed($im,$w,$h){
  59.                 if(empty($im) || empty($w) || empty($h) || !is_numeric($w) || !is_numeric($h)){
  60.                         throw new Exception("缺少必须的参数");
  61.                 }
  62.                 $im = imagecreatefromstring($im); //创建图像
  63.                 list($im_w,$im_h) = self::getsize($im); //获取图像宽高
  64.                 if($im_w > $im_h || $w < $h){
  65.                         $new_h = intval(($w / $im_w) * $im_h);
  66.                         $new_w = $w;
  67.                 }else{
  68.                         $new_h = $h;
  69.                         $new_w = intval(($h / $im_h) * $im_w);
  70.                 }
  71.                 //echo "$im_w x $im_h <br/> $new_w x $new_h <br/> $x $y";exit;
  72.                 //开始创建缩放后的图像
  73.                 $dst_im = imagecreatetruecolor($new_w,$new_h);
  74.                 imagecopyresampled($dst_im,$im,0,0,0,0,$new_w,$new_h,$im_w,$im_h);
  75.                 header('Content-type:image/jpeg');
  76.                 imagepng($dst_im);
  77.                 imagedestroy($dst_im);imagedestroy($im);
  78.         }

  79.         /*
  80.         * 获取图像大小
  81.         * @param string  $im 图像元数据
  82.         * @return array
  83.         */
  84.         protected static function getsize($im){
  85.                 return array(imagesx($im),imagesy($im));
  86.         }
  87. }
复制代码

index.html HTML表单文件
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  2. <html xmlns="http://www.w3.org/1999/xhtml">
  3. <head>
  4. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  5. <title>Mongo Gridfs</title>
  6. </head>

  7. <body>
  8. <form action="gfs.php" method="post" enctype="multipart/form-data">
  9.     <input type="file" name="upfile"  />
  10.     <input type="submit" value="upload" /> <a href="gfs.php">查看图片</a>
  11. </form>
  12. </body>
  13. </html>
复制代码

代码下载:
顺便宣传一下自己的博客 http://tmkook.com/blog/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值