逆风天 发表于 2023-1-27 12:00:28

PHP实现单文件、多个单文件、多文件上传函数的封装示例

本帖最后由 逆风天 于 2023-1-27 12:08 编辑

这篇文章主要介绍了PHP实现单文件、多个单文件、多文件上传函数的封装,结合实例形式详细分析了php文件上传的原理及针对文件上传函数的封装相关操作技巧,需要的朋友可以参考下
本文实例讲述了PHP实现单文件、多个单文件、多文件上传函数的封装。
文件目录
./
index.html
Start.php
/function/
               upload.php



index.html 内部代码:
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>无标题文档</title>
</head>
<body>
<form action="Start.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>要在选择上传文件时能一次选择多个文件,那么就加multiple="multiple" ,还有注意下name="myFile1"和name="myFile[]"的区别,单文件、多文件上传.
Start.php内部代码:
<?php
header("content-type:text/html;charset=utf-8");
require_once 'function/Upload.php';
$files=getFiles();
//修改允许上传文件的类型,为('jpeg','jpg','png','gif','html','txt'),也可以增加新的,如pdf,pptx等等
$allowExt=array('jpeg','jpg','png','gif','html','txt');
foreach($files as $fileInfo){
   //修改上传保存的文件夹为本地的'imooc',如果没有这个文件夹,那么就创建一个
   //'false'参数:不要检查上传的文件是否为真实的图片,因为要允许上传除开图片类型外的其他类型文件,如html、txt
   $res=uploadFile($fileInfo,'imooc',false,$allowExt);
   echo $res['mes'],'<br/>';
   $uploadFiles[]=$res['dest'];//如果要不显示错误信息的话,用@$uploadFiles[]=$res['dest'];
}
$uploadFiles=array_values(array_filter($uploadFiles));//这样便于保存到数据库
print_r($uploadFiles);//打印查看上传保存的结果
?>
<a href="index.html">再次上传</a>

upload.php 内部代码:
<?php
header('Content-Type:text/html;charset=utf-8');
//得到文件扩展名
function getExt($filename){
return strtolower(pathinfo($filename,PATHINFO_EXTENSION));
}
//产生唯一字符串
function getUniName(){
return md5(uniqid(microtime(true),true));
}
//构建上传文件信息
function getFiles()
{
$i = 0;
foreach ($_FILES as $file) {
    //因为这时$_FILES是个三维数组,并且上传单文件或多文件时,数组的第一维的类型不同,这样就可以拿来判断上传的是单文件还是多文件
    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;
}
//针对于单文件、多个单文件、多文件的上传
//默认允许上传的文件只为图片类型,并且只有这些图片类型:$allowExt=array('jpeg','jpg','png','gif');并且检查上传的文件是否为真实的图片$flag=true
//默认上传保存的文件夹为本地的'uploads'文件夹,允许上传文件的大小最大为2M
function uploadFile($fileInfo, $path = './uploads', $flag = true, $allowExt = array('jpeg', 'jpg', 'png', 'gif'), $maxSize = 2097152)
{
//判断错误号
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; //如果要不显示错误信息的话,用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 {
    //匹配错误信息
    //注意!错误信息没有5
    switch ($fileInfo['error']) {
      case 1:
      $res['mes'] = '上传文件超过了PHP配置文件中upload_max_filesize选项的值';
      break;
      case 2:
      $res['mes'] = '超过了HTML表单MAX_FILE_SIZE限制的大小';
      break;
      case 3:
      $res['mes'] = '文件部分被上传';
      break;
      case 4:
      $res['mes'] = '没有选择上传文件';
      break;
      case 6:
      $res['mes'] = '没有找到临时目录';
      break;
      case 7:
      $res['mes'] = '文件写入失败';
      break;
      case 8:
      $res['mes'] = '上传的文件被PHP扩展程序中断';
      break;
    }
    return $res;
}
}


这个示例整合到了我自己写的Discuz插件,完美使用,但是有一点就是报错什么的,调用不出来,还得再试试。
页: [1]
查看完整版本: PHP实现单文件、多个单文件、多文件上传函数的封装示例