查看 6536
回复 0
PHP实现单文件、多个单文件、多文件上传函数的封装示例
逆风天

16

主题

0

回帖

105

积分
发表于 2023-1-27 12:00:28
显示全部楼层 阅读模式
本帖最后由 逆风天 于 2023-1-27 12:08 编辑
这篇文章主要介绍了PHP实现单文件、多个单文件、多文件上传函数的封装,结合实例形式详细分析了php文件上传的原理及针对文件上传函数的封装相关操作技巧,需要的朋友可以参考下

本文实例讲述了PHP实现单文件、多个单文件、多文件上传函数的封装。
文件目录
./
  index.html
  Start.php
  /function/
                 upload.php



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


upload.php 内部代码:
  1. <?php
  2. header('Content-Type:text/html;charset=utf-8');
  3. //得到文件扩展名
  4. function getExt($filename){
  5.   return strtolower(pathinfo($filename,PATHINFO_EXTENSION));
  6. }
  7. //产生唯一字符串
  8. function getUniName(){
  9.   return md5(uniqid(microtime(true),true));
  10. }
  11. //构建上传文件信息
  12. function getFiles()
  13. {
  14.   $i = 0;
  15.   foreach ($_FILES as $file) {
  16.     //因为这时$_FILES是个三维数组,并且上传单文件或多文件时,数组的第一维的类型不同,这样就可以拿来判断上传的是单文件还是多文件
  17.     if (is_string($file['name'])) {
  18.       //如果是单文件
  19.       $files[$i] = $file;
  20.       $i++;
  21.     } elseif (is_array($file['name'])) {
  22.       //如果是多文件
  23.       foreach ($file['name'] as $key => $val) {
  24.         $files[$i]['name'] = $file['name'][$key];
  25.         $files[$i]['type'] = $file['type'][$key];
  26.         $files[$i]['tmp_name'] = $file['tmp_name'][$key];
  27.         $files[$i]['error'] = $file['error'][$key];
  28.         $files[$i]['size'] = $file['size'][$key];
  29.         $i++;
  30.       }
  31.     }
  32.   }
  33.   return $files;
  34. }
  35. //针对于单文件、多个单文件、多文件的上传
  36. //默认允许上传的文件只为图片类型,并且只有这些图片类型:$allowExt=array('jpeg','jpg','png','gif');并且检查上传的文件是否为真实的图片$flag=true
  37. //默认上传保存的文件夹为本地的'uploads'文件夹,允许上传文件的大小最大为2M
  38. function uploadFile($fileInfo, $path = './uploads', $flag = true, $allowExt = array('jpeg', 'jpg', 'png', 'gif'), $maxSize = 2097152)
  39. {
  40.   //判断错误号
  41.   if ($fileInfo['error'] === UPLOAD_ERR_OK) {
  42.     //检测上传文件的大小
  43.     if ($fileInfo['size'] > $maxSize) {
  44.       $res['mes'] = $fileInfo['name'] . '上传文件过大';
  45.     }
  46.     $ext = getExt($fileInfo['name']);
  47.     //检测上传文件的文件类型
  48.     if (!in_array($ext, $allowExt)) {
  49.       $res['mes'] = $fileInfo['name'] . '非法文件类型';
  50.     }
  51.     //检测是否是真实的图片类型
  52.     if ($flag) {
  53.       if (!getimagesize($fileInfo['tmp_name'])) {
  54.         $res['mes'] = $fileInfo['name'] . '不是真实图片类型';
  55.       }
  56.     }
  57.     //检测文件是否是通过HTTP POST上传上来的
  58.     if (!is_uploaded_file($fileInfo['tmp_name'])) {
  59.       $res['mes'] = $fileInfo['name'] . '文件不是通过HTTP POST方式上传上来的';
  60.     }
  61.     if ($res) return $res; //如果要不显示错误信息的话,用if( @$res ) return $res;
  62.     //$path='./uploads';
  63.     //如果没有这个文件夹,那么就创建一
  64.     if (!file_exists($path)) {
  65.       mkdir($path, 0777, true);
  66.       chmod($path, 0777);
  67.     }
  68.     //新文件名唯一
  69.     $uniName = getUniName();
  70.     $destination = $path . '/' . $uniName . '.' . $ext;
  71.     //@符号是为了不让客户看到错误信,也可以删除
  72.     if (!@move_uploaded_file($fileInfo['tmp_name'], $destination)) {
  73.       $res['mes'] = $fileInfo['name'] . '文件移动失败';
  74.     }
  75.     $res['mes'] = $fileInfo['name'] . '上传成功';
  76.     $res['dest'] = $destination;
  77.     return $res;
  78.   } else {
  79.     //匹配错误信息
  80.     //注意!错误信息没有5
  81.     switch ($fileInfo['error']) {
  82.       case 1:
  83.         $res['mes'] = '上传文件超过了PHP配置文件中upload_max_filesize选项的值';
  84.         break;
  85.       case 2:
  86.         $res['mes'] = '超过了HTML表单MAX_FILE_SIZE限制的大小';
  87.         break;
  88.       case 3:
  89.         $res['mes'] = '文件部分被上传';
  90.         break;
  91.       case 4:
  92.         $res['mes'] = '没有选择上传文件';
  93.         break;
  94.       case 6:
  95.         $res['mes'] = '没有找到临时目录';
  96.         break;
  97.       case 7:
  98.         $res['mes'] = '文件写入失败';
  99.         break;
  100.       case 8:
  101.         $res['mes'] = '上传的文件被PHP扩展程序中断';
  102.         break;
  103.     }
  104.     return $res;
  105.   }
  106. }
复制代码


这个示例整合到了我自己写的Discuz插件,完美使用,但是有一点就是报错什么的,调用不出来,还得再试试。
您需要登录后才可以回帖 登录 立即注册
QQ 快速回复 返回列表