一般情况采取第一种方法,直接传文件,第二种方法适合生成的数据不用保存到本地再上传而是直接以二进制存到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);
}
}
一、直接过滤掉
$reg= array(“\r\n”, “\n”, “\r”);
$replace = ”;
$str=str_replace($reg, $replace, $str);
这样内容就不会有换行了。
二、变成一个换行
var_dump($str) 打印内容出来,在浏览器看到:
string 'hlmblog这是一个神奇的网站
分享it技术和总结
我们都来了,你呢' (length=89)
右击鼠标点击查看网页源代码后:
'hlmblog这是一个神奇的网站 分享it技术和总结 我们都来了,你呢'
其中:
//是html的转义字符,分别代表回车换行
我们要做的就是把上面的多个换行转义字符变成一个,见下面的代码:
$str= preg_replace("/([\s]{2,})/","\n",$str);
内容变成下面的格式,多个换行成功转换成一个换行,在手机端app和浏览器可以正常显示。
1'hlmblog这是一个神奇的网站 分享it技术和总结 我们都来了,你呢'
浏览器对于<br>或者转义标签字符都可以解析,如果想要将内容里面的转义换行转换成<br>,可以
直接用nl2br,但是手机端app不解析<br>,除非做转移处理。
nl2br("hlmblog这是一个神奇的网站 分享it技术和总结 我们都来了,你呢");
nl2br() 函数是在字符串中的每个新行 (\n) 之前插入 HTML 换行符 (<br>)
对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))