多文件上传函数这么写是不是就可以了,有什么需要补充或者改进的

来源:2-15 文件上传函数封装

辰小七

2019-01-24 14:14:34

上传页面

<form action="dome.php" method="post" enctype="multipart/form-data">
        <input type="file" name="myfile[]" multiple><br>
        <!-- <input type="file" name="onefile"><br> -->
        <input type="submit" name="sub" value="上传">
    </form>

跳转页面

<?php 
require('func_file.php');
$filearray = $_FILES['myfile'];
upload_multiple_files($filearray);

多文件上传函数部分

/**
 * upload_multiple_files             多文件上传
 * @param  array     $filearray         多文件上传通过_FILES获得的数组
 * @return array                     upload_file函数的结果
 */
function upload_multiple_files(array $filearray)
{
    foreach ($filearray['name'] as $key => $value) {
         $fileInfo[$key]['name']=$filearray['name'][$key];
         $fileInfo[$key]['type']=$filearray['type'][$key];
         $fileInfo[$key]['tmp_name']=$filearray['tmp_name'][$key];
         $fileInfo[$key]['error']=$filearray['error'][$key];
         $fileInfo[$key]['size']=$filearray['size'][$key];
    } 
    foreach ($fileInfo as $key => $value) {
        upload_file($value,['doc']);
        echo '<br>';
    }
}

文件上传部分

/**
 * upload_file
 * @param     array         $fileInfo         通过_FILES接收的数组
 * @param     array         $allowExt         规定可以上传的文件名
 * @param     bool         $imageFlag         是否检测上传文件为真实图片
 * @param     int         $maxSize         最大上传文件大小
 * @param     string         $uploadPath     上传文件存储位置
 * @return     string                         错误信息|上传文件存储位置的路径
 * 上传文件表单属性应添加enctype="multipart/form-data"
 */
function upload_file(array $fileInfo,array $allowExt=['jpg','png','jpeg','gif'],bool $imageFlag=false,int $maxSize=2097152,string $uploadPath='./uploads')
{
    
    

    // 读取fileInfo的数据
    $name     = $fileInfo['name'];
    $type     = $fileInfo['type'];
    $tmp_name = $fileInfo['tmp_name'];
    $error    = $fileInfo['error'];
    $size     = $fileInfo['size'];

    // 判断错误类型
    if ($error!==0) {
        switch ($error) {
            case 1:
                $msg = UPLOAD_ERRS['UPLOAD_ERR_INI_SIZE'];
                break;
            case 2:
                $msg = UPLOAD_ERRS['UPLOAD_ERR_FORM_SIZE'];
                break;
            case 3:
                $msg = UPLOAD_ERRS['UPLOAD_ERR_PARTIAL'];
                break;
            case 4:
                $msg = UPLOAD_ERRS['UPLOAD_ERR_NO_FILE'];
                break;
            case 6:
                $msg = UPLOAD_ERRS['UPLOAD_ERR_NO_TMP_DIR'];
                break;
            case 7:
                $msg = UPLOAD_ERRS['UPLOAD_ERR_CANT_WRITE'];
                break;
            case 8:
                $msg = UPLOAD_ERRS['UPLOAD_ERR_EXTENSION'];
                break;
        }
        echo $msg;
        return false;
    }

    // 获取上传的文件的后缀,判断后缀是否符合规定
    $ext = strtolower(pathinfo($name,PATHINFO_EXTENSION));
    if (!in_array($ext, $allowExt)) {
        echo UPLOAD_ERRS['FILE_TYPE_NOT_CONFORMING'];
        return false;
    }

    // 判断是否为一张真实的图片,因为仅在上传图片时使用所以加一个参数,默认是不判断的
    if ($imageFlag) {
        if (@!getimagesize($tmp_name)) {
            echo UPLOAD_ERRS['FILE_CORRUPTED'];
            return false;
        }
    }
    
    // 判断上传文件的大小是否符合规定
    if ($size>$maxSize) {
        echo UPLOAD_ERRS['FILE_SIZE_VIOLATION'];
        return false;
    }

    // 判断文件是不是通过HTTP POST上传的
    if (!is_uploaded_file($tmp_name)) {
        echo UPLOAD_ERRS['UPLOAD_FILE_VIA_HTTP_POST'];
        return false;
    }

    // 如果存放上传路径的文件夹不存在就创建一个
    if (!is_dir($uploadPath)) {
        mkdir($uploadPath,0777,true);
    }

    // 生产唯一文件名
    $newName = pathinfo($name)['filename'];
    $uniqidName = $newName.'_'.uniqid();
    // 给文件名加上路径
    $dest = $uploadPath.DIRECTORY_SEPARATOR.$uniqidName.'.'.$ext;
    // 移动临时文件到指定的存储位置
    if (@!move_uploaded_file($tmp_name, $dest)) {
        echo UPLOAD_ERRS['FILE_NOVE_FAILED'];
        return false;
    }else{
        echo "文件上传成功";
        return $dest;
    }

}


写回答

1回答

好帮手慕查理

2019-01-24

您好,多文件上传在《PHP常用技术与ThinkPHP5框架开发》阶段进行了讲解,建议同学可以先听下课程。祝学习愉快!

0

0 学习 · 4928 问题

查看课程