900字范文,内容丰富有趣,生活中的好帮手!
900字范文 > php多图片(文件)上传

php多图片(文件)上传

时间:2021-10-28 00:23:57

相关推荐

php多图片(文件)上传

本人两天前写了一个单个图片上传的博客,现在写一个多文件上传的

先写一个添加图片的界面,比较简陋,但是这里有三种不同的方式

第一种:

<form action="doAction3.php" method="post" enctype="multipart/form-data"><input type="file" name="myFile1" /><br><input type="file" name="myFile2"/><br><input type="file" name="myFile3"/><br><input type="submit" value="上传"/></form>

第二种:

<form action="doAction3.php" method="post" enctype="multipart/form-data"><input type="file" name="myFile[]" /><br><input type="file" name="myFile[]"/><br><input type="file" name="myFile[]"/><br><input type="submit" value="上传"/></form>

第三种

<form action="doAction3.php" method="post" enctype="multipart/form-data"><input type="file" name="myFile[]" multiple="multiple" /><br><input type="submit" value="上传"/></form>

第一种说白了就是多个单文件上传,再次不再多加描述,不懂的可以去看我上一集写的博客

单文件上传

主要说第二种和第三种

第二种,是点击一次,选择一个文件,图中只有三行input代码,所以只能一次性上传3张图片

第三种,是点击一次,可以选择多张图片,选择完成,点击提交之前会显示选择了几个文件

第二种和第三种,点击上传之后我们在后端接受到的都是一个一样的三维数组,如图所示,我们先打印出来看看这个三维数组

[myFile] => Array([name] => Array([0] => 上海建桥学院 Shanghai Jian Qiao University.jpg[1] => 54c5b4120001f20808000902.jpg[2] => 52e3677900013d6a05020261.jpg)[type] => Array([0] => image/jpeg[1] => image/jpeg[2] => image/jpeg)[tmp_name] => Array([0] => C:\wamp\tmp\php4945.tmp[1] => C:\wamp\tmp\php4B78.tmp[2] => C:\wamp\tmp\php4BE6.tmp)[error] => Array([0] => 0[1] => 0[2] => 0)[size] => Array([0] => 876196[1] => 159952[2] => 28190))

我们可以看到,这是把单个文件中的各个属性归了类,重新组成了一个数组,因此我们要把这个数组转换多个单文件数组:

function buildInfo(){//$info = $_FILES;$i = 0;foreach ($_FILES as $v){//三维数组转换成2维数组if(is_string($v['name'])){ //单文件上传$info[$i] = $v;$i++;}else{ // 多文件上传foreach ($v['name'] as $key=>$val){//2维数组转换成1维数组//取出一维数组的值,然后形成另一个数组//新的数组的结构为:info=>i=>('name','size'.....)$info[$i]['name'] = $v['name'][$key];$info[$i]['size'] = $v['size'][$key];$info[$i]['type'] = $v['type'][$key];$info[$i]['tmp_name'] = $v['tmp_name'][$key];$info[$i]['error'] = $v['error'][$key];$i++;}}}return $info;}

通过以上封装的buildInfo方法,我们可以把传过来的三维数组转换为多个单文件数组,我们打印出来看一下:

array0 => array'name' => string '上海建桥学院 Shanghai Jian Qiao University.jpg' (length=52)'size' => int 876196'type' => string 'image/jpeg' (length=10)'tmp_name' => string 'C:\wamp\tmp\phpC8A5.tmp' (length=23)'error' => int 01 => array'name' => string '54c5b4120001f20808000902.jpg' (length=28)'size' => int 159952'type' => string 'image/jpeg' (length=10)'tmp_name' => string 'C:\wamp\tmp\phpCAA9.tmp' (length=23)'error' => int 02 => array'name' => string '52e3677900013d6a05020261.jpg' (length=28)'size' => int 28190'type' => string 'image/jpeg' (length=10)'tmp_name' => string 'C:\wamp\tmp\phpCB08.tmp' (length=23)'error' => int 0

如图所示,我们已经得到了多个单文件(图片)组成的新数组,接下来我们来上传:

function uploadfile($path="uploads",$allowExt = array('png','jpg','jpeg','gif','mmp','qnmlgb'),$maxSize=1048576,$imgFlag=true){if (! file_exists($path)) {mkdir($path,0777,true);}$i = 0;$infoArr = buildInfo();foreach ($infoArr as $val) {if ($val['error'] === UPLOAD_ERR_OK) {$ext = getExt($val['name']);for($j=0;$j<count($allowExt);$j++){if($ext == $allowExt[$j]){$m = "此文件适合上传标准";$h = $m;}else {$m = "此文件不可以被上传";}}if($h){$mes = "文件格式正确";}else{$mes = "文件格式错误";exit;}if($val['size']>$maxSize){$mes = "文件太大了";exit;}if($imgFlag){$result = getimagesize($val['tmp_name']);if(!$result){$mes = "您上传的不是一个真正图片";exit;}}if(!is_uploaded_file($val['tmp_name'])){$mes = "不是通过httppost传输的";exit;}$realName = getUniName().".".$ext;$destination = $path."/".$realName;if(move_uploaded_file($val['tmp_name'], $destination)){$val['name'] = $realName;unset($val['error'],$val['tmp_name'],$val['size'],$val['type']);$uploadedFiles[$i]=$val;//?????????$i++;}}else {switch ($val['error']) {case 1: // UPLOAD_ERR_INI_SIZE$mes = "超过配置文件中上传文件的大小";break;case 2: // UPLOAD_ERR_FORM_SIZE$mes = "超过表单中配置文件的大小";break;case 3: // UPLOAD_ERR_PARTIAL$mes = "文件被部分上传";break;case 4: // UPLOAD_ERR_NO_FILE$mes = "没有文件被上传";break;case 6: // UPLOAD_ERR_NO_TMP_DIR$mes = "没有找到临事文件目录";break;case 7: // UPLOAD_ERR_CANT_WRITE$mes = "文件不可写";break;case 8: // UPLOAD_ERR_EXTENSION$mes = "php扩展程序中断了上传程序";break;}echo $mes;}}return $uploadedFiles;}

在封装函数的时候我们把这几个默认变量赋值了:

$path="uploads", //文件存放路径$allowExt = array('png','jpg','jpeg','gif','mmp','qnmlgb')//可被存放的文件后缀名,注mmp,qnmlgb是我瞎写的后缀名$maxSize=1048576,//设置文件上传的大小,1048576为1m$imgFlag=true//判断是否真为一张图片,可为true,也可为false

接来下就是各种判断:

if (! file_exists($path)) {mkdir($path,0777,true);}

这是用来判断路径是否存在,要是不存在则创建

$i = 0;$infoArr = buildInfo();

我们设置一个$infoArr来接受上面已经转化好的多个单文件数组,接下来就是用foreach循环来上传图片,并返回一个包含所有上传图片名称的数组,我们一步步来看

foreach ($infoArr as $val) {if ($val['error'] === UPLOAD_ERR_OK) {}else {switch ($val['error']) {case 1: // UPLOAD_ERR_INI_SIZE$mes = "超过配置文件中上传文件的大小";break;case 2: // UPLOAD_ERR_FORM_SIZE$mes = "超过表单中配置文件的大小";break;case 3: // UPLOAD_ERR_PARTIAL$mes = "文件被部分上传";break;case 4: // UPLOAD_ERR_NO_FILE$mes = "没有文件被上传";break;case 6: // UPLOAD_ERR_NO_TMP_DIR$mes = "没有找到临事文件目录";break;case 7: // UPLOAD_ERR_CANT_WRITE$mes = "文件不可写";break;case 8: // UPLOAD_ERR_EXTENSION$mes = "php扩展程序中断了上传程序";break;}echo $mes;}

我们可以看出这是用来判断error类型的,只有当error的值为UPLOAD_ERR_OK时才可以进行下一步判断

$ext = getExt($val['name']);for($j=0;$j<count($allowExt);$j++){if($ext == $allowExt[$j]){$m = "此文件适合上传标准";$h = $m;}else {$m = "此文件不可以被上传";}}if($h){$mes = "文件格式正确";}else{$mes = "文件格式错误";exit;}

这是用来判断文件后缀名的方法,当数组中name的值得后缀名在我们规定的范围内时,我们才允许进行下一步,否则直接退出。

代码中的getExt($val[‘name’])

getExt()这是我们之前定义的方法,作用是截取文件名的后缀名代码如下

/*** 得到文件的扩展名* @param unknown $fileName* @return string*/function getExt($fileName){return strtolower(end(explode('.',$fileName)));/*** strtolower() 函数把字符串转换为小写。* end()输出数组中最后一个元素的值* explode(),拆分字符串*/}

接下来继续判断

if($imgFlag){$result = getimagesize($val['tmp_name']);if(!$result){$mes = "您上传的不是一个真正图片";exit;}}

getimagesize这是用来判断是否真的是一张图片的方法,不是则会返回false

if($val['size']>$maxSize){$mes = "文件太大了";exit;}

判断文件是否超过预设大小,之前我们设置的是1m

if(!is_uploaded_file($val['tmp_name'])){$mes = "不是通过httppost传输的";exit;}

判断文件是不是通过http post方式提交的

$realName = getUniName().".".$ext;$destination = $path."/".$realName;if(move_uploaded_file($val['tmp_name'], $destination)){$val['name'] = $realName;unset($val['error'],$val['tmp_name'],$val['size'],$val['type']);$uploadedFiles[$i]=$val;//?????????$i++;}

我们通过move_uploaded_file()方法将图片传递到相应文件夹中,

且将文件夹中的文件名传到 $uploadedFiles数组中

运行一下,发现页面上输出了包含三个文件的文件名的数组,且文件夹中出现了三个文件,至此上传成功

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。