• php上传文件那些事


    有好几天没有更新博文了,最近博主去学车去了,晒的可黑了。回到正题,本次,博主给大家带来php上传文件。


    • 客户端
      在网页中,必须采用post方式来上传文件,并且必须设置表单的enctype属性为multipart/form-data,还需要设置input标签type 属性为filename属性中的内容用于服务器端进行标识,定义代码如下。
    <form action="01.php" method="post" enctype="multipart/form-data">
        <input type="file" name="pic"/><br/>
        <input type="submit" value="提交"/>
    </form>

    • 服务器端获取上传文件信息
      当客户端提交表单后,服务器端就可以获取上传文件的信息了。上传文件的信息都会存储到$_FILES这样的一个全局数组中,我们可以打印数组查看结果。

      代码

    <?php
    print_r($_FILES);
    ?>

    打印结果

    打印结果如下,是一个数组,pic 是客户端的标识,name 下标指的是上传文件的文件名,type下标指的是上传文件的类型,tmp_name 下标指的是上传的文件在服务器端存放的临时文件名,error 下标是上传文件错误的表示,可用于检测文件是否上传,以便找到错误的原因,size 下标是上传文件的大小,单位是字节。

    这里写图片描述


    • 保存文件
      上传文件后,文件被上传到服务器端用于存放上传文件的临时目录中,如果在php代码执行结束后并没有将文件保存到其他位置,那么该临时文件将会被删除。所以,文件上传之后,都应该进行移动操作,将文件保存到其他位置。
    <?php
    echo move_uploaded_file($_FILES['pic']['tmp_name'], "./".$_FILES['pic']['name'])?"ok":"fail";
    ?>

    • 随机文件名及按日期存储
      在做项目时,在处理文件上传时,我们应该这样做处理,使用随机字符串作为文件名,这样后面上传的文件就不会把之前上传的同名文件给覆盖了;还有一个就是让文件夹按日期动态生成,这样比较方便管理员进行管理。
    <?php
    /**
     * 生成随机文件名,按日期存储
     * @author webbc
     */
    $fname = rand(10000,99999);//随机文件名
    $ext = strrchr($_FILES['pic']['name'],'.');//截取文件的扩展名
    $path = './'.date('Y/m/d');//文件存储的路径
    //如果目录不存在,就创建目录
    if(!is_dir($path)){
        mkdir($path,0777,true);
    }
    $saveFile = $path.'/'.$fname.$ext;//保存的文件名
    echo move_uploaded_file($_FILES['pic']['tmp_name'],$saveFile)?"ok":"fail";
    ?>

    上面这段代码的含义是,先生成随机字符串作为文件名,然后获取上传文件的扩展名,然后根据日期动态生成目录,然后保存文件。


    • 项目中的文件上传
      封装常用函数
    <?php
    /**
     * 创建上传文件的路径
     * @return str/bool 上传文件的目录
     */
    function createDir(){
        $path = '/upload/'.date('Y/m/d');
        $fpath = ROOT.$path;
        if(is_dir($fpath) || mkdir($fpath,0777,true)){
            return $path;
        }else{
            return false;
        }
    }
    
    /**
     * 随机字符串函数,作为文件名
     * @param int $num 指定所要的随机字符串长度
     * @return str 随机字符串
     */
    function randStr($num=6){
        $str = str_shuffle('abcdefghjkmnpqrstuvwxyzABCDEFGHJKMNPQRSTUVWXYZ23456789');
        return substr($str,0,$num);
    }
    
    /**
     * 获取指定文件的扩展名,包括.
     * @param str $file 文件名
     * @return str 文件扩张名
     */
    function getExt($file){
        return strchr($file,'.');
    }
    ?>

    使用
    注意:如果要保存到数据库的话,应当保存的是文件的相对路径

    <?php
        if($_FILES['pic']['name'] !== '' && $_FILES['pic']['error'] == 0){//判断是否在上传
            $file = createDir().'/'.randStr().getExt($_FILES['pic']['name']);//生成文件名
            move_uploaded_file($_FILES['pic']['tmp_name'] , ROOT.$file);//保存文件
            ...可进行数据库操作...
        }
    ?>

    • 上传文件的相应配置
      在php配置文件中,有许多关于上传文件的配置,我们应该也要熟悉。
      file_uploads = On/Off:代表文件上传是否可用
    upload_tmp_dir="D:/Program Files (x86)/wamp/tmp" :代表文件保存到服务器的临时目录
    upload_max_filesize = 2M :上传文件的最大限制

    记得配置好以后,重启apache服务,希望这篇文章能给大家带来帮助。

  • 相关阅读:
    利用中转输出表制作HijackDll
    webshell查杀
    说说无线路由器后门的那些事儿(1)-D-Link篇
    htpwdScan — 一个简单的HTTP暴力破解、撞库攻击脚本
    OD消息断点
    Burp Suite详细使用教程-Intruder模块详3
    burp intruder模块详解
    谈谈神的能力
    语法入门基本概念
    多项式
  • 原文地址:https://www.cnblogs.com/cnsec/p/13407087.html
Copyright © 2020-2023  润新知