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

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

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

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

单个文件上传 upload1.php

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>单文件上传</title>
</head>
<body>
    <form action="doAction5.php" method="post" enctype="multipart/form-data">
        请选择您要上传的文件:
        <input type="file" name="myFile"/><br/>
        <input type="submit" value="上传文件"/>
    </form>
</body>
</html>

多个单文件上传 upload2.php

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>多个单文件上传</title>
</head>
<body>
    <form action="doAction5.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="file" name="myFile4"/><br/>
        <input type="submit" value="上传文件"/>
    </form>
</body>
</html>

多文件上传 upload3.php

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>多文件上传</title>
</head>
<body>
    <form action="doAction5.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="file" name="myFile[]"/><br/>
        <input type="submit" value="上传文件"/>
    </form>
</body>
</html>
混合方式文件上传 upload4.php

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>混合方式文件上传</title>
</head>
<body>
    <form action="doAction5.php" method="post" enctype="multipart/form-data">
        请选择您要上传的文件:<input type="file" name="myFile1"/><br/>
        请选择您要上传的文件:<input type="file" name="myFile2"/><br/>
        请选择您要上传的文件:<input type="file" name="myFile[]"/><br/>
        请选择您要上传的文件:<input type="file" name="myFile[]"/><br/>
        请选择您要上传的文件:<input type="file" name="myFile[]" multiple="multiple"/><br/>
        <input type="submit" value="上传文件"/>
    </form>
</body>
</html>

文件上传处理 doAction5.php

<?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'],'<br/>';

    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

<?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;
    }
}




  • 4
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值