PHP实现GRIDFS存储文件到MONGODB的教程

 更新时间:2016年11月25日 17:04  点击:1739
我们知道GridFS是一种将大型文件存储在MongoDB的文件规范了,下文我们就一起来看一篇PHP实现GRIDFS存储文件到MONGODB的教程,具体步骤如下。


一般情况采取第一种方法,直接传文件,第二种方法适合生成的数据不用保存到本地再上传而是直接以二进制存到MongoDB,第三种方式是直接把表单上传的文件存进MongoDB.


//初始化gridfs
$conn = new Mongo(); //连接MongoDB
$db = $conn->photos; //选择数据库
$grid = $db->getGridFS(); //取得gridfs对象
 
//gridfs有三种方式存储文件
//第一种直接存储文件
$id = $grid->storeFile("./logo.png");
 
//第二种存储文件二进制流
$data = get_file_contents("./logo.png");
$id = $grid->storeBytes($data,array("parame"=>’附加参数将随图片一起存入’));
 
//第三种保存直接表单提交的文件$_FILES
$id = $grid->storeUpload('upfile');
//相当于
$id = $grid->storeFile($_FILES[‘upfile’][‘tmp_name’]);
 
//--------------以上是保存图片--下面开始读取图片----------------
 
//保存成功后返回$id = md5字符串
$logo = $grid->findOne(array('_id'=>$id)); //以_id为索引取得文件
header('Content-type: image/png'); //输出图片头
echo $logo ->getBytes(); //输出数据流

这种感觉就是文件流形式保存到数据库了,让小编觉得觉得就是把图片文件保存到数据库一样的道理了。

前面介绍一篇GRIDFS文件存储到MONGODB数据库中了,下面来看一个MONGODB GRIDFS存取文件PHP示例,希望这个例子对各位有用。


最近项目需要用到MongoDB存取文件,这里有个简单的PHP示例:


public function run(){
 //初始化gridfs
 $m = new MongoClient(); // 连接
 $db = $m->selectDB("excel");
 //dump($m);exit;
 //$collection = $db->testexcel;
 $grid = $db->getGridFS(); //取得gridfs对象
 
 //gridfs有三种方式存储文件
 //第一种直接存储文件
 $id = $grid->storeFile(dirname(__FILE__)."/EmptyAction.class.php");
 echo $id;
 
 //获取文件
 $file = $grid->findOne(array('_id'=>$id)); //以_id为索引取得文件
 //header('Content-type: image/png'); //输出图片头
 dump($file);
}

在MongoDB命令行中查看所有上传的文件:

1.show dbs

列出所有数据库

2.use excel

进入名为excel的数据库

3.db.fs.files.find()

列出所有上传的文件

通过GridFS上传获取文件,它默认是传到fs.files这个collection中。GridFS有两个集合,”fs.chunks”和”fs.files”,前者是分片存储,后者是普通文件存储,适合小于4M的文件。

json_encode在php5.4之前对中文的处理还是有一些问题了,但在php5.4之后我们可以利用JSON_UNESCAPED_UNICODE来让json更好的支持中文了,下面来看看具体的步骤。


我们知道, 用PHP的json_encode来处理中文的时候, 中文都会被编码, 变成不可读的, 类似”\u***”的格式, 还会在一定程度上增加传输的数据量.

<?php
echo json_encode("中文");
 
//"\u4e2d\u6587"

这就让我们这些在天朝做开发的同学, 很是头疼, 有的时候还不得不自己写json_encode.

而在PHP5.4, 这个问题终于得以解决, Json新增了一个选项: JSON_UNESCAPED_UNICODE, 故名思议, 就是说, Json不要编码Unicode.

看下面的例子:

<?php
echo json_encode("中文", JSON_UNESCAPED_UNICODE);
 
//"中文"

怎么样, 是不是让大家很开心的改动? 呵呵, 当然, Json在5.4还加入了: JSON_BIGINT_AS_STRING, JSON_PRETTY_PRINT, JSON_UNESCAPED_SLASHES等选项

HP5.4才支持JSON_UNESCAPED_UNICODE这个参数,此参数是让中文字符在json_encode的时候不用转义,减少数据传输量。但在PHP5.3中,就得自己写个函数来实现,以下就是解决方法:


/**
* 对变量进行 JSON 编码
* @param mixed value 待编码的 value ,除了resource 类型之外,可以为任何数据类型,该函数只能接受 UTF-8 编码的数据
* @return string 返回 value 值的 JSON 形式
*/
function json_encode_ex($value)
{
    if (version_compare(PHP_VERSION,'5.4.0','<'))
    {
        $str = json_encode($value);
        $str = preg_replace_callback(
                                    "#\\\u([0-9a-f]{4})#i",
                                    function($matchs)
                                    {
                                         return iconv('UCS-2BE', 'UTF-8', pack('H4', $matchs[1]));
                                    },
                                     $str
                                    );
        return $str;
    }
    else
    {
        return json_encode($value, JSON_UNESCAPED_UNICODE);
    }
}

对于有一些代码或者内容它出现的不是html的换行而是程序中的nr之类的换行了,下面我们一起来看看一个关于php 多个换行变成一个换行或者直接过滤掉例子。


一、直接过滤掉

$reg= array(“\r\n”, “\n”, “\r”);
$replace = ”;
$str=str_replace($reg, $replace, $str);

这样内容就不会有换行了。

二、变成一个换行

var_dump($str) 打印内容出来,在浏览器看到:

string 'hlmblog这是一个神奇的网站


分享it技术和总结


我们都来了,你呢' (length=89)

右击鼠标点击查看网页源代码后:


'hlmblog这是一个神奇的网站&#10;&#10;分享it技术和总结&#10;&#10;我们都来了,你呢'
其中:


&#13;&#10; //是html的转义字符,分别代表回车换行

我们要做的就是把上面的多个换行转义字符变成一个,见下面的代码:


$str= preg_replace("/([\s]{2,})/","\n",$str);

内容变成下面的格式,多个换行成功转换成一个换行,在手机端app和浏览器可以正常显示。

1'hlmblog这是一个神奇的网站&#10;分享it技术和总结&#10;我们都来了,你呢'
浏览器对于<br>或者转义标签字符都可以解析,如果想要将内容里面的转义换行转换成<br>,可以
直接用nl2br,但是手机端app不解析<br>,除非做转移处理。


nl2br("hlmblog这是一个神奇的网站&#10;分享it技术和总结&#10;我们都来了,你呢");
nl2br() 函数是在字符串中的每个新行 (\n) 之前插入 HTML 换行符 (<br>)

array_multisort函数是php自带对二维数据进行排序的函数,下面我们一起来看看多维数组排序 array_multisort函数用法,希望文章能够帮助到各位。


对2维数组或者多维数组排序是常见的问题,在php中我们有个专门的多维数组排序函数,下面简单介绍下:
array_multisort(array1,sorting order, sorting type,array2,array3..)是对多个数组或多维数组进行排序的函数。


第一个参数是数组,随后的每一个参数可能是数组,也可能是下面的排序顺序标志(排序标志用于更改默认的排列顺序)之一:
SORT_ASC - 默认,按升序排列。(A-Z)
SORT_DESC - 按降序排列。(Z-A)
随后可以指定排序的类型:
SORT_REGULAR - 默认。将每一项按常规顺序排列。
SORT_NUMERIC - 将每一项按数字顺序排列。
SORT_STRING - 将每一项按字母顺序排列


简单的情况。有两个数组:


$arr1 = array(1,9,5);
$arr2 = array(6,2,4);
array_multisort($arr1,$arr2);
print_r($arr1); // 得到的顺序是1,5,9
print_r($arr2); // 得到的顺序是6,4,2

我估计两个数组的值自始至终都是对应着的:1对应6,9对应2,5对应4。
我们再加多一个数组看看会怎样:


$arr1 = array(1,9,5);
$arr2 = array(6,2,4);
$arr3 = array(3,7,8);
array_multisort($arr1,$arr2,$arr3);

查看结果,1自始至终都对应6对应3,其它项也是如此。这种对应关系就是手册中所谓的“排序时保留原有的键名关联”。
另外也可以把每个数组想像成数据库表的一列。而对应着的1,6,3为一数据行,9,2,7为另一数据行。。。
array_multisort会先按第一个数组(想像成列)排序,如果第一个数组(列)的值相同,则按第二个数组(列)排序。
具体可以用下面的程式来测试:


$arr1 = array(1,9,5,9);
$arr2 = array(6,2,4,1);
$arr3 = array(3,7,8,0);
array_multisort($arr1,$arr2,$arr3);

可以想像这里$arr3的结果是(3,8,0,7)。

例子

<?php
//php 多维数组排序 array_multisort 的使用
$data[] = array('volume' => 67, 'edition' => 2);
$data[] = array('volume' => 86, 'edition' => 1);
$data[] = array('volume' => 85, 'edition' => 6);
$data[] = array('volume' => 98, 'edition' => 2);
$data[] = array('volume' => 86, 'edition' => 6);
$data[] = array('volume' => 67, 'edition' => 7);
// 生成排序字段数组
foreach ($data as $key => $row) {
    $volume[$key]  = $row['volume'];
    $edition[$key] = $row['edition'];
}

//根据volume降序,edition升序
array_multisort($volume, SORT_DESC, $edition, SORT_ASC, $data);

//排序后的数组
print_r($data);
exit;

?>

补充:看看两个实际例子:

1、一次对多个数组进行排序:


$num1 = array(3, 5, 4, 3);
$num2 = array(27, 50, 44, 78);
array_multisort($num1, SORT_ASC, $num2, SORT_DESC);

print_r($num1);
print_r($num2);
//result: Array ( [0] => 3 [1] => 3 [2] => 4 [3] => 5 ) Array ( [0] => 78 [1] => 27 [2] => 44 [3] => 50 )


2、对多维数组(以二位数组为例)进行排序:

$arr = array(
    '0' => array(
        'num1' => 3,
        'num2' => 27
    ),
   
    '1' => array(
        'num1' => 5,
        'num2' => 50
    ),
   
    '2' => array(
        'num1' => 4,
        'num2' => 44
    ),
   
    '3' => array(
        'num1' => 3,
        'num2' => 78
    )
);

foreach ( $arr as $key => $row ){
    $num1[$key] = $row ['num1'];
    $num2[$key] = $row ['num2'];
}

array_multisort($num1, SORT_ASC, $num2, SORT_DESC, $arr);

print_r($arr);
//result:Array([0]=>Array([num1]=>3 [num2]=>78) [1]=>Array([num1]=>3 [num2]=>27) [2]=>Array([num1]=>4 [num2]=>44) [3]=>Array([num1]=>5 [num2]=>50))

[!--infotagslink--]

相关文章

  • PHP添加MongoDB扩展实例教程

    由于要使用mikoomi mongodb plugin插件,所以需要php对mongodb的扩展支持,默认通过源安装的php并没有mongodb的扩展支持,具体可以通过php -m|grep mongo 验证 。这里就结...2016-11-25
  • php读取zip文件(删除文件,提取文件,增加文件)实例

    下面小编来给大家演示几个php操作zip文件的实例,我们可以读取zip包中指定文件与删除zip包中指定文件,下面来给大这介绍一下。 从zip压缩文件中提取文件 代...2016-11-25
  • Jupyter Notebook读取csv文件出现的问题及解决

    这篇文章主要介绍了JupyterNotebook读取csv文件出现的问题及解决,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2023-01-06
  • php语言实现redis的客户端

    php语言实现redis的客户端与服务端有一些区别了因为前面介绍过服务端了这里我们来介绍客户端吧,希望文章对各位有帮助。 为了更好的了解redis协议,我们用php来实现...2016-11-25
  • jQuery+jRange实现滑动选取数值范围特效

    有时我们在页面上需要选择数值范围,如购物时选取价格区间,购买主机时自主选取CPU,内存大小配置等,使用直观的滑块条直接选取想要的数值大小即可,无需手动输入数值,操作简单又方便。HTML首先载入jQuery库文件以及jRange相关...2015-03-15
  • Photoshop打开PSD文件空白怎么解决

    有时我们接受或下载到的PSD文件打开是空白的,那么我们要如何来解决这个 问题了,下面一聚教程小伙伴就为各位介绍Photoshop打开PSD文件空白解决办法。 1、如我们打开...2016-09-14
  • 解决python 使用openpyxl读写大文件的坑

    这篇文章主要介绍了解决python 使用openpyxl读写大文件的坑,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-13
  • C#实现HTTP下载文件的方法

    这篇文章主要介绍了C#实现HTTP下载文件的方法,包括了HTTP通信的创建、本地文件的写入等,非常具有实用价值,需要的朋友可以参考下...2020-06-25
  • SpringBoot实现excel文件生成和下载

    这篇文章主要为大家详细介绍了SpringBoot实现excel文件生成和下载,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-02-09
  • C#操作本地文件及保存文件到数据库的基本方法总结

    C#使用System.IO中的文件操作方法在Windows系统中处理本地文件相当顺手,这里我们还总结了在Oracle中保存文件的方法,嗯,接下来就来看看整理的C#操作本地文件及保存文件到数据库的基本方法总结...2020-06-25
  • JS实现的简洁纵向滑动菜单(滑动门)效果

    本文实例讲述了JS实现的简洁纵向滑动菜单(滑动门)效果。分享给大家供大家参考,具体如下:这是一款纵向布局的CSS+JavaScript滑动门代码,相当简洁的手法来实现,如果对颜色不满意,你可以试着自己修改CSS代码,这个滑动门将每一...2015-10-21
  • php无刷新利用iframe实现页面无刷新上传文件(1/2)

    利用form表单的target属性和iframe 一、上传文件的一个php教程方法。 该方法接受一个$file参数,该参数为从客户端获取的$_files变量,返回重新命名后的文件名,如果上传失...2016-11-25
  • php批量替换内容或指定目录下所有文件内容

    要替换字符串中的内容我们只要利用php相关函数,如strstr,str_replace,正则表达式了,那么我们要替换目录所有文件的内容就需要先遍历目录再打开文件再利用上面讲的函数替...2016-11-25
  • PHP文件上传一些小收获

    又码了一个周末的代码,这次在做一些关于文件上传的东西。(PHP UPLOAD)小有收获项目是一个BT种子列表,用户有权限上传自己的种子,然后配合BT TRACK服务器把种子的信息写出来...2016-11-25
  • AI源文件转photoshop图像变模糊问题解决教程

    今天小编在这里就来给photoshop的这一款软件的使用者们来说下AI源文件转photoshop图像变模糊问题的解决教程,各位想知道具体解决方法的使用者们,那么下面就快来跟着小编...2016-09-14
  • Zend studio文件注释模板设置方法

    步骤:Window -> PHP -> Editor -> Templates,这里可以设置(增、删、改、导入等)管理你的模板。新建文件注释、函数注释、代码块等模板的实例新建模板,分别输入Name、Description、Patterna)文件注释Name: 3cfileDescriptio...2013-10-04
  • C++万能库头文件在vs中的安装步骤(图文)

    这篇文章主要介绍了C++万能库头文件在vs中的安装步骤(图文),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-02-23
  • jQuery+slidereveal实现的面板滑动侧边展出效果

    我们借助一款jQuery插件:slidereveal.js,可以使用它控制面板左右侧滑出与隐藏等效果,项目地址:https://github.com/nnattawat/slideReveal。如何使用首先在页面中加载jquery库文件和slidereveal.js插件。复制代码 代码如...2015-03-15
  • php文件上传你必须知道的几点

    本篇文章主要说明的是与php文件上传的相关配置的知识点。PHP文件上传功能配置主要涉及php.ini配置文件中的upload_tmp_dir、upload_max_filesize、post_max_size等选项,下面一一说明。打开php.ini配置文件找到File Upl...2015-10-21
  • ant design中upload组件上传大文件,显示进度条进度的实例

    这篇文章主要介绍了ant design中upload组件上传大文件,显示进度条进度的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-10-29