doaction5.php,PHP实现单文件上传、多个单文件上传、多文件上传的过程化封装

上回提到 PHP的单个文件上传、多个单文件上传、多文件上传

这里给出 三种方式的统一实现

下面先给出各种方式的文件提交页面:

单个文件上传 upload1.php

单文件上传

请选择您要上传的文件:

多个单文件上传 upload2.php

多个单文件上传

请选择您要上传的文件:

请选择您要上传的文件:

请选择您要上传的文件:

请选择您要上传的文件:

多文件上传 upload3.php

多文件上传

请选择您要上传的文件:

请选择您要上传的文件:

请选择您要上传的文件:

请选择您要上传的文件:

混合方式文件上传 upload4.php

混合方式文件上传

请选择您要上传的文件:

请选择您要上传的文件:

请选择您要上传的文件:

请选择您要上传的文件:

请选择您要上传的文件:

文件上传处理 doAction5.php

/**

* Created by PhpStorm.

* User: DreamBoy

* Date: 2016/4/8

* Time: 21:39

*/

header('content-type:text/html;charset=utf-8');

include_once 'upload.func.php';

$files = getFiles();

//print_r($files);

foreach($files as $fileInfo) {

$res = uploadFile($fileInfo);

echo $res['mes'],'
';

if(isset($res['dest'])) {

$uploadFiles[] = $res['dest'];

}

}

//过滤掉上传失败的文件

/**

* array_values() 函数返回一个包含给定数组中所有键值的数组,但不保留键名。

* 提示:被返回的数组将使用数值键,从 0 开始并以 1 递增。

*/

/**

* array_filter() 函数用回调函数过滤数组中的值。

* 该函数把输入数组中的每个键值传给回调函数。如果回调函数返回 true,

* 则把输入数组中的当前键值返回结果数组中。数组键名保持不变。

*/

//这里使用array_filter过滤掉数组中的空内容

if(isset($uploadFiles)) {

$uploadFiles=array_filter($uploadFiles);

print_r($uploadFiles);

}

实现文件上传的函数 upload.func.php

/**

* Created by PhpStorm.

* User: DreamBoy

* Date: 2016/4/8

* Time: 21:41

*/

/**

* 构建上传文件信息

* @return mixed

*/

function getFiles() {

$i = 0;

foreach($_FILES as $file) {

//单文件或者多个单文件上传

if(is_string($file['name'])) {

$files[$i] = $file;

$i++;

} //多文件上传

elseif(is_array($file['name'])) {

foreach($file['name'] as $key=>$val) {

$files[$i]['name'] = $file['name'][$key];

$files[$i]['type'] = $file['type'][$key];

$files[$i]['tmp_name'] = $file['tmp_name'][$key];

$files[$i]['error'] = $file['error'][$key];

$files[$i]['size'] = $file['size'][$key];

$i++;

}

}

}

return $files;

}

/**

* 获取文件扩展名

*/

function getExt($filename) {

return strtolower(pathinfo($filename,PATHINFO_EXTENSION));

}

/**

* 获取唯一字符串

*/

function getUniName() {

return md5(uniqid(microtime(true), true));

}

/**

* 针对于单文件、多个单文件、多文件的上传

* @param array $fileInfo

* @param string $path

* @param bool $flag

* @param int $maxSize

* @param array $allowExt

* @return array

*/

function uploadFile($fileInfo, $path='./uploads',$flag=true,$maxSize=1048576,$allowExt = array('jpeg','jpg','gif','png')) {

//$allowExt = array('jpeg','jpg','gif','png');

//$flag = true;

//$maxSize = 1048576; //1M

$res = array();

//判断错误号

if($fileInfo['error'] == UPLOAD_ERR_OK) {

//检测上传文件的大小

if($fileInfo['size'] > $maxSize) {

$res['mes'] = $fileInfo['name'] . '上传文件过大';

}

$ext = getExt($fileInfo['name']);

//检测上传文件的文件类型

if(!in_array($ext, $allowExt)) {

$res['mes'] = $fileInfo['name'] . '非法文件类型';

}

//检测是否是真是的图片类型

if($flag) {

if(!getimagesize($fileInfo['tmp_name'])) {

$res['mes'] = $fileInfo['name'] . '不是真实图片类型';

}

}

//检测文件是否是通过HTTP POST上传上来的

if(!is_uploaded_file($fileInfo['tmp_name'])) {

$res['mes'] = $fileInfo['name'] . '文件不是通过HTTP POST方式上传上来的';

}

if($res) return $res;

//$path = './uploads';

if(!file_exists($path)) {

mkdir($path, 0777, true);

chmod($path, 0777);

}

$uniName = getUniName();

$destination = $path . '/' . $uniName . '.' . $ext;

if(!move_uploaded_file($fileInfo['tmp_name'],$destination)) {

$res['mes'] = $fileInfo['name'] . '文件移动失败';

}

$res['mes'] = $fileInfo['name'] . '上传成功';

$res['dest'] = $destination;

return $res;

} else {

//匹配错误信息

switch($fileInfo['error']) {

case 1:

$res['mes'] = '上传文件超过了PHP配置文件中upload_max_filesize选项的值';

break;

case 2:

$res['mes'] = '超过了表单MAX_FILE_SIZE限制的大小';

break;

case 3:

$res['mes'] = '文件部分被上传';

break;

case 4:

$res['mes'] = '没有选择上传文件';

break;

case 6:

$res['mes'] = '没有找到临时目录';

break;

case 7:

case 8:

$res['mes'] = '系统错误';

break;

}

return $res;

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值