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

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

01

<?php

02

// 初始化gridfs

03

$conn = new Mongo(); // 连接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为索引取得文件

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>

时间: 2024-10-14 00:10:23

PHP操作MongoDB GridFS 存储文件,如图片文件的相关文章

【转】PHP操作MongoDB GridFS 存储文件

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

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

GridFS是MongoDB的一个内置功能,它提供一组文件操作的API以利用MongoDB存储文件,GridFS的基本原理是将文件保存在两个Collection中,一个保存文件索引,一个保存文件内容,文件内容按一定大小分成若干块,每一块存在一个Document中,这种方法不仅提供了文件存储,还提供了对文件相关的一些附加属性(比如MD5值,文件名等等)的存储. <?php // 初始化gridfs $conn = new Mongo(); // 连接MongoDB $db = $conn->ph

将gridFS中的图片文件写入硬盘

开启用户验证下的gridfs 连接使用,在执行脚本前可以在python shell中 from pymongo import Connectionfrom gridfs import *con = Connection("mongodb://admin:[email protected]:27017")#用URI的方式建立数据库的链接,当然也有其他的方式进行授权,现在是mongodb的管理员帐号,普通帐号不知道为什么不可以,db = con['repository']#连接到具体的数据

MongoDB之GridFS存储文件

1.MongoDB 的 GridFS 详细分析 GridFS简介 GridFS是MongoDB中的一个内置功能,可以用于存放大量小文件. http://www.mongodb.org/display/DOCS/GridFS http://www.mongodb.org/display/DOCS/GridFS+Specification GridFS使用 MongoDB提供了一个命令行工具mongofiles可以来处理GridFS,在bin目录下. 列出所有文件: mongofiles list

mongodb Gridfs操作

GridFS 介绍 GridFS是MongoDB规范用于存储和检索大文件,如图片,音频文件,视频文件等.这是一种文件系统用来存储文件,但数据存储于MongoDB集合中.GridFS存储文件比其文档大小16MB限制的更大能力. GridFS的划分一个文件分成块存储数据每个块在一个单独的文件,每个最大尺寸255K. GridFS默认使用两个集合 fs.files 和 fs.chunks 存储该文件的元数据和块.每组块标识其唯一的_id ObjectID字段.fs.files切断作为父文件. fs.c

【转发】mongodb Gridfs操作

原文链接:https://www.cnblogs.com/wangjing666/p/6844598.html GridFS 介绍 GridFS是MongoDB规范用于存储和检索大文件,如图片,音频文件,视频文件等.这是一种文件系统用来存储文件,但数据存储于MongoDB集合中.GridFS存储文件比其文档大小16MB限制的更大能力. GridFS的划分一个文件分成块存储数据每个块在一个单独的文件,每个最大尺寸255K. GridFS默认使用两个集合 fs.files 和 fs.chunks 存

C#对图片文件的压缩、裁剪操作

在做项目时,对图片的处理,以前都采用在上传时,限制其大小的方式,这样带来诸多不便.毕竟网站运维人员不一定会对图片做处理,经常超出大小限制,即使会使用图片处理软件的,也由于个人水平方面原因,处理效果差强人意. 于是采用C#为我们提供的图像编辑功能,实现一站式上传,通过程序生成所需大小.尺寸的目标图片. 进入正题--> 先说图片压缩 第一步:需要读取一个图片文件,读取方法: // <param name="ImageFilePathAndName">图片文件的全路径名称&

Ruby操作MongoDB数据库(进阶十二)--GridFS

本章我们进行进阶教程的最后一篇,GridFS的学习.在本章中,我们将要学习下述内容: 创建一个GridFS对象("Grid::FSBucket") 写数据流处理 读数据流处理 找到文件元数据 文件删除 操作Grid::File对象 文件插入 文件查找 文件删除 Ruby驱动为数据库中块文件存储的处理提供了一个简单整洁的接口,也就是"GridFS".这个API接口让我们既可以使用Grid::File对象,也可以使用读写流. 创建一个GridFS对象("Gri

C#对图片文件的压缩、裁剪操作初探

在做项目时,对图片的处理,以前都采用在上传时,限制其大小的方式,这样带来诸多不便.毕竟网站运维人员不一定会对图片做处理,经常超出大小限制,即使会使用图片处理软件的,也由于个人水平方面原因,处理效果差强人意. 于是采用C#为我们提供的图像编辑功能,实现一站式上传,通过程序生成所需大小.尺寸的目标图片. 进入正题--> 先说图片压缩 第一步:需要读取一个图片文件,读取方法: // <param name="ImageFilePathAndName">图片文件的全路径名称&