课程咨询 :025-86971863

南京PHP培训 > 雇主企业 > 企业笔试题 > php实现文件上传与下载
  • php实现文件上传与下载

    发布:南京PHP培训      来源:企业笔试题    

  • 出现不想让用户看见的信息,可以使用错误抑制符号@;当然能echo的东西都是可以赋值给一个变量的;

    定义用户上传文件类型,将其放在数组变量allowExt中,用if(!in_array(第一个参数为获取上传文件的后缀名,可以使用strtolower函数来判定 点号‘ .’之后的后缀名,或者也可以用自带扩展函数pathinfo(file的名字,PATHINFO_EXTENSION)来判定,第二个参数就是允许上传的类型的数组变量allowExt);但是这种情况下,用户万一上传上来一个病毒信息,只是改了后缀名,就要用到getimagesize来获取图片的信息,基本信息会有图片的宽度和高度以及类型,部分还会有channel和bits;如果允许用户上传的不仅仅是图片类型,则使用flag的布尔值进行判定;

    还要注意的是用户上传的文件的命名,不能存在重名覆盖现象,可以使用md5(uniqid(microtime(true),true))或类似函数进行判定;

    有的时候用户需要上传到自己的某个目录下,则可以用if(!files_exit(path))进行判定,不存在就用mkdir ($path,0777,true)来自定义上传的路径;

    在各种判定之后,可以将这个文件封装成一个函数,将下文中会使用到的变量设置为该函数的参数,在调用时可以传参,在单文件多文件上传的时候可以直接调用函数即可,大大简化代码量;

    单文件上传基本思路也就是:先检测错误信息,一一匹配,用switch……case输出对应的错误信息------》检测文件上传的类型是否是自己定义的数组中的某一个-----》检测上传文件是否满足规范中的大小要求----》检测文件图片等内容是否是真实的图片类型等(用flag和getimagesize获取信息)----》检测文件是否通过http post方法传上来的----》定义文件上传进来的名字和路径(此时需要检测路径是否存在以及同名文件是否存在,采用加密方式重命名)---》上传成功,返回具体的数组变量或者上传文件名。

    1 <?php

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

    3

    4 function upload($fileInfo,$allowExt = array('jpeg', 'jpg',  'png',  'gif', 'pdf'), $maxSize = 2097152, $path = 'text', $flag = true)

    5 {

    6     $fileInfo = $_FILES['file1'];

    7 //     $maxSize = 2097152; // 允许上传的最大字节数2M

    8     // $flag = true; // 检测是否真实类型

    9      // 允许上传的文件类型,直接放在参数里了

    10 //    $allowExt = array(

    11 //         'jpeg',

    12 //         'png',

    13 //         'png',

    14 //         'gif',

    15 //         'pdf'

    16 //     );

    17     if(!is_array($allowExt)){

    18         exit('系统错误');

    19     }

    20     // 1、判断错误号

    21     if ($fileInfo['error'] == 0) {

    22         // 判断上传文件的大小www.2cto.com

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

    24             exit('上传文件过大');

    25         }

    26         // 判断文件类型:两种方法--使用截取后缀名或者用自带扩展名的判定来判定

    27         $ext = pathinfo($fileInfo['name'], PATHINFO_EXTENSION);

    28         $ext = strtolower(end(explode('.', $fileInfo['name'])));

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

    30             exit('非法文件类型');

    31         }

    32         // 判断文件是否通过http post方式穿上的

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

    34             exit('文件不是通过http post方法传上来的');

    35         }

    36         if ($flag) {

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

    38                 exit('不是真正的图片类型');

    39             }

    40         }

    41         // 上传文件,先判定路径是否存在,如果不存在则建立

    42        // $path = 'text';

    43         if (! file_exists($path)) {

    44             mkdir($path, 0777, true);

    45             chmod($path, 0777);

    46         }

    47

    48         // 要确保文件名唯一,防止重名产生覆盖,使用加密函数md5,mcrotime表示微秒数,两个参数则为true;

    49         $uniName = md5(uniqid(microtime(true), true)) . '.' . $ext;

    50 //   测试是否可以加密输出      echo $uniName;

    51 //         exit();

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

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

    54             // echo '上传成功';可以不仅仅是显示返回成功,可以返回文件的信息内容等

    55 //             return array(

    56 //                 'newName' => $destination,

    57 //                 'size' => $fileInfo['size'],

    58 //                 'type' => $fileInfo['type']

    59 //             );

    60             return $destination;

    61             //如果只要一个文件名,则return $destination即可

    62         } else {

    63             echo '上传失败';

    64         }

    65     } else {

    66         // 匹配错误信息,与err号应该一一对应的

    67         switch ($fileInfo['error']) {

    68             case 1:

    69                 $remindMes= '上传文件超过了php配置文件中upload_max_filesize选项的值';

    70                 break;

    71             case 2:

    72                $remindMes= '上传文件超过了表单max_file_size选项的值';

    73                 break;

    74             case 3:

    75                $remindMes=  '文件部分被上传';

    76                 break;

    77             case 4:

    78                 $remindMes= '没有选择上传文件';

    79                 break;

    80             case 6:

    81                 $remindMes=  '沒有找到临时目录';

    82                 break;

    83             case 7:

    84

    85             case 8:

    86                $remindMes=  '系统错误';

    87                 break;

    88         }

    89         exit($remindMes);

    90     }

    91 }

    南京php培训:nj.php.tedu.cn

    推荐文章

上一篇:php中的$_REQUEST和$_SERVER

下一篇:php实现文件上传与下载(上)

最新开班日期  |  更多

PHP高级开发工程师就业班

PHP高级开发工程师就业班

开班日期:04-28

PHP高级开发工程师精品班

PHP高级开发工程师精品班

开班日期:04-28

PHP高级开发工程师周末班

PHP高级开发工程师周末班

开班日期:04-28

PHP高级开发工程师定制班

PHP高级开发工程师定制班

开班日期:04-28

  • 地址:南京市秦淮区太平南路333号金陵御景园8楼达内
  • 课程培训电话:025-86971863     全国服务监督电话:400-111-8989
  • 服务邮箱 tousu@tedu.cn
  • 2002-2018 达内时代科技集团有限公司 版权所有 京ICP证8000853号-56