GridFS是MongoDB的一個內置功能,它提供一組文件操做的API以利用MongoDB存儲文件,GridFS的基本原理是將文件保存在兩個Collection中,一個保存文件索引,一個保存文件內容,文件內容按必定大小分紅若干塊,每一塊存在一個Document中,這種方法不只提供了文件存儲,還提供了對文件相關的一些附加屬性(好比MD5值,文件名等等)的存儲。php
01html
<?php數據庫
02post
// 初始化gridfsui
03.net
$conn = new Mongo(); // 鏈接MongoDBorm
04xml
$db = $conn->photos; // 選擇數據庫htm
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爲索引取得文件
24
header('Content-type: image/png'); // 輸出圖片頭
25
echo $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 = new Mongo(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'=>new MongoId($id)));
7
header('Content-type: image/png');
8
echo $object->getBytes();
最近因工做須要研究了下GridFS,並整理了個Demo出來。。分享一下經驗。。
gfs.php文件
01
<?php
02
// 鏈接Mongo並初始化GFS
03
$conn = new Mongo(C('127.0.0.1:27017')); //若是設置了密碼本身配置DSN
04
$db=$conn->selectDB('edu_sns'); // 選擇數據庫
05
$collection = $db->getGridFS('zk_attach'); // 選擇集合,相等於選擇數據表
06
07
// 上傳圖片
08
if (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'));
14
if (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 {
26
unlink($_FILES['upfile']['tmp_name']);
27
}
28
echo "<p>圖片路徑爲: <font color=red>http://{$_SERVER['HTTP_HOST']}{$_SERVER['REQUEST_URI']}?img={$md5}</font></p>";
29
30
} elseif ($id = $_GET['img']) { // 生成圖片
31
32
// 索引圖片文件
33
$image = $collection->findOne(array('md5' => $id));
34
35
// 設定文檔類型,顯示圖片
36
$img_bytes = $image->getBytes();
37
include_once 'thumb.php';
38
$w = is_numeric($_GET['w']) ? intval($_GET['w']) : 100;
39
Thumb::maxWidth($img_bytes, $w);
40
41
} elseif ($id = $_GET['del']) { // 刪除圖片
42
$s = $collection->remove(array('md5' => $id));
43
header('Location:' . $_SERVER['HTTP_REFERER']);
44
45
} else { // 圖片列表
46
$cursor = $collection->find();
47
foreach ($cursor as $obj) :
48
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>';
49
endforeach
50
;
51
}
52
?>
thumb.php 縮略圖文件
001
<?php
002
class Thumb {
003
004
/**
005
* 以最大寬度縮放圖像
006
*
007
* @param string $im 圖像元數據
008
* @param float $w 最大寬度
009
*/
010
static function maxWidth($im, $w) {
011
if (empty($im) || empty($w) || !is_numeric($w)) {
012
throw new Exception("缺乏必須的參數");
013
}
014
$im = imagecreatefromstring($im); // 建立圖像
015
list ($im_w, $im_h) = self::getsize($im); // 獲取圖像寬高
016
if ($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);
024
imagecopyresampled($dst_im, $im, 0, 0, 0, 0, $new_w, $new_h, $im_w, $im_h);
025
header('Content-type:image/jpeg');
026
imagepng($dst_im);
027
imagedestroy($dst_im);
028
imagedestroy($im);
029
}
030
031
/**
032
* 以最大高度縮放圖像
033
*
034
* @param string $im 圖像元數據
035
* @param float $w 最大高度
036
*/
037
static function maxHeight($im, $h) {
038
if (empty($im) || empty($h) || !is_numeric($h)) {
039
throw new Exception("缺乏必須的參數");
040
}
041
$im = imagecreatefromstring($im); // 建立圖像
042
list ($im_w, $im_h) = self::getsize($im); // 獲取圖像寬高
043
if ($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);
051
imagecopyresampled($dst_im, $im, 0, 0, 0, 0, $new_w, $new_h, $im_w, $im_h);
052
header('Content-type:image/jpeg');
053
imagepng($dst_im);
054
imagedestroy($dst_im);
055
imagedestroy($im);
056
}
057
058
/**
059
* 生成固定大小的圖像並按比例縮放
060
*
061
* @param string $im 圖像元數據
062
* @param float $w 最大寬度
063
* @param float $h 最大高度
064
*/
065
static function fixed($im, $w, $h) {
066
if (empty($im) || empty($w) || empty($h) || !is_numeric($w) || !is_numeric($h)) {
067
throw new Exception("缺乏必須的參數");
068
}
069
$im = imagecreatefromstring($im); // 建立圖像
070
list ($im_w, $im_h) = self::getsize($im); // 獲取圖像寬高
071
if ($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 <br/> $new_w x $new_h <br/> $x $y";exit;
079
// 開始建立縮放後的圖像
080
$dst_im = imagecreatetruecolor($new_w, $new_h);
081
imagecopyresampled($dst_im, $im, 0, 0, 0, 0, $new_w, $new_h, $im_w, $im_h);
082
header('Content-type:image/jpeg');
083
imagepng($dst_im);
084
imagedestroy($dst_im);
085
imagedestroy($im);
086
}
087
088
/*
089
* 獲取圖像大小
090
*
091
* @param string $im 圖像元數據
092
* @return array
093
*/
094
protected static function getsize($im) {
095
return array(
096
imagesx($im),
097
imagesy($im)
098
);
099
}
100
}
101
?>
index.html HTML表單文件
01
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
02
<html xmlns="http://www.w3.org/1999/xhtml">
03
<head>
04
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
05
<title>Mongo Gridfs</title>
06
</head>
07
08
<body>
09
<form action="gfs.php" method="post" enctype="multipart/form-data">
10
<input type="file" name="upfile" />
11
<input type="submit" value="upload" /> <a href="gfs.php">查看圖片</a>
12
</form>
13
</body>
14
</html>