PHP文件系统之文件上传

文件的上传包括单文件上传和多文件上传

PHP配置php.ini文件

  • 开启文件上传 file_uploads=On;

  • 设置临时目录 upload_tmp_dir=;

  • 上传文件大小的限制 upload_max_size=10M

  • 上传文件的数量的限制 max_file_uploads=20;

post方式提交的最大数据限制(一般大于upload_max_filesize) post_max_size=20M;

通过表单提交的方式上传文件

1.请求方式必须是post

2.需要用到input type=file

3.设置属性 enctype="multipart/form-data"(只有文件上传时用)

添加一个隐藏的input type=hidden MAX_FILE_SIZE 值是字节数

$_POST 接受表单信息

$_FILES 接收文件信息

is_uploaded_file($filename) 检测是否是上传文件

move_uploaded_file(src,des) 移动文件从原路径到新路径

临时路径

/*UPLOAD_ERR_OK

其值为 0,没有错误发生,文件上传成功。

UPLOAD_ERR_INI_SIZE

其值为 1,上传的文件超过了 php.ini 中 upload_max_filesize 选项限制的值。

UPLOAD_ERR_FORM_SIZE

其值为 2,上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值。

UPLOAD_ERR_PARTIAL

其值为 3,文件只有部分被上传。

UPLOAD_ERR_NO_FILE

其值为 4,没有文件被上传。

UPLOAD_ERR_NO_TMP_DIR

其值为 6,找不到临时文件夹。PHP 4.3.10 和 PHP 5.0.3 引进。

UPLOAD_ERR_CANT_WRITE

其值为 7,文件写入失败。PHP 5.1.0 引进。

Note:

以上值在 PHP 4.3.0 之后变成了 PHP 常量。
第一种:单文件上传

HTML

<form action="0fileupload.php" method="post" enctype="multipart/form-data">

<input type="hidden" name="MAX_FILE_SIZE" value="10000000">

文件上传:<input type="file" name="pic">

<input type="submit" value="文件上传">

</form>

PHP

查看post方式提交过来的$_FILES

array(1) {

["pic"]=>

array(5) {

["name"]=>

string(8) "preg.png"

["type"]=>

string(9) "image/png" MIME类型

["tmp_name"]=>

string(41) "D:\wampstack-5.6.19-0\php\tmp\phpE8DC.tmp"

["error"]=> 整型表示

int(0)

["size"]=>

int(180823)

}

}

if(isset($_FILES['pic'])){

$file_info=$_FILES['pic'];

// 第一步,错误限制

// error=0 表示没有错误 error>0 表示出错

if($file_info['error']>0){

$error_no=$file_info['error'];
 

switch ($error_no){

case UPLOAD_ERR_INI_SIZE:

echo "文件太大,超出配置范围大小";

break;

case UPLOAD_ERR_FORM_SIZE:

echo "文件太大,超出表单范围大小";

break;

case UPLOAD_ERR_PARTIAL:

echo "文件只是部分上传,没有上传完全部";

break;

case UPLOAD_ERR_NO_FILE:

echo "没有文件被上传";

break;

default:

echo "未知错误";

break;

}

exit;

}

// 第二步:大小限制

$file_size=$file_info['size'];

$max_size=5000000;

if($file_size>$max_size){

echo "文件超出最大限制";

exit;

}

// 第三步:类型限制

$file_type=$file_info['type'];

$file_type=end(explode('/',$file_type)); //end()返回数组中最后一个元素的值

// 得到类型是MIME类型 image/png image/jpg等

$mimeTypes=['png','jpeg','jpg','gif'];

if(!in_array($file_type,$mimeTypes)){

echo "类型不允许";

exit;

}

// 处理上传文件目录

$upload_dir='./upload';

if(!file_exists($upload_dir)){

mkdir($upload_dir);

}

// 处理一个唯一的文件名,可以用 时间戳+随机数

$file_name=time().mt_rand(1,999).'.'.$file_type;

// 处理完整的文件路径

$file_path=$upload_dir.DIRECTORY_SEPARATOR.$file_name;

// 处理文件

$tmp_path=$_FILES['pic']['tmp_name'];//临时路径

// 临时文件会在PHP代码执行完毕后自动清除

if(is_uploaded_file($tmp_path)){ //检测是否是上传文件

if(move_uploaded_file($tmp_path,$file_path)){ //移动原路径到新路径

echo "成功";

} else{

echo "失败";

}

}else{

echo "这不是一个上传文件";

}

}

错误代码

  • UPLOAD_ERR_INI_SIZE 常量 值:1 表示上传的文件大小超过了php.ini中设置的值upload_max_filesize

  • UPLOAD_ERR_FORM_SIZE 常量 值:2 表示上传的文件大小超过了表单中设置的MAX_FILE_SIZE

  • UPLOAD_ERR_PARTIAL 值:3 表示文件只是部分上传,没有上传完全部

  • UPLOAD_ERR_NO_FILE 值:4 表示没有文件被上传

第二种:多文件上传,将name改成数组形式的名字

<form action="2fileupload.php" method="post" enctype="multipart/form-data">

    <input type="hidden" name="MAX_FILE_SIZE" value="10000000">

    多文件上传:<input type="file" name="pic[]"><br>

    多文件上传:<input type="file" name="pic[]"><br>

    多文件上传:<input type="file" name="pic[]"><br>

    <input type="submit" value="文件上传">

</form>
if(isset($_FILES['pic'])){

    $info=$_FILES['pic'];

    $arrs=array();

//    将数据信息按照名称分类;

    foreach ($info  as $key=>$value){

//        key:name type size error tmp_name

//        value:array(0:value1;1:value2...),array()...

        if(is_array($value)){

            $i=0;

          /* while (list($attr_key,$attr_value)=each($value)){

                $arrs[$i][$key]=$attr_value;

                $i++;

            }  与foreach等价*/

            foreach ($value as $attr_key=>$attr_value){

//                attr_key:0,1,2..

//                attr_value:val1,val2..

                $arrs[$i][$key]=$attr_value;

                $i++;

            }

        }

    }

    foreach ($arrs as $file_info){

        echo "<pre>";

        var_dump($arrs);

        var_dump($file_info);

        echo "</pre>";

        verify_upload($file_info);

    }

}

//验证上传信息

function verify_upload($file_info){

//    第一步,错误限制

//    error=0 表示没有错误 error>0 表示出错

    if($file_info['error']>0){

        $error_no=$file_info['error'];

        switch ($error_no){

            case UPLOAD_ERR_INI_SIZE:

                echo "文件太大,超出配置范围大小<br>";

                break;

            case UPLOAD_ERR_FORM_SIZE:

                echo "文件太大,超出表单范围大小<br>";

                break;

            case UPLOAD_ERR_PARTIAL:

                echo "文件只是部分上传,没有上传完全部<br>";

                break;

            case UPLOAD_ERR_NO_FILE:

                echo "没有文件被上传<br>";

                break;

            default:

                echo "未知错误<br>";

                break;

        }

        return;

    }

    //    第二步:大小限制

    $file_size=$file_info['size'];

    $max_size=5000000;

    if($file_size>$max_size){

        echo "文件超出最大限制<br>";

        return;

    }

//    第三步:类型限制

    $file_type=$file_info['type'];

    $file_type=end(explode('/',$file_type));  //end()返回数组中最后一个元素的值

//    得到类型是MIME类型 image/png image/jpg等

    $mimeTypes=['png','jpeg','jpg','gif'];

    if(!in_array($file_type,$mimeTypes)){

        echo "类型不允许<br>";

        return;

    }

//    处理上传文件

    $upload_dir='./upload';

    if(!file_exists($upload_dir)){

        mkdir($upload_dir);

    }

//    处理一个唯一的文件名,可以用 时间戳+随机数

    $file_name=time().mt_rand(1,999).'.'.$file_type;

//    处理完整的文件路径

    $file_path=$upload_dir.DIRECTORY_SEPARATOR.$file_name;

//    处理文件

    $tmp_path=$file_info['tmp_name'];//临时路径

//    临时文件会在PHP代码执行完毕后自动清除

    if(is_uploaded_file($tmp_path)){  //检测是否是上传文件

        if(move_uploaded_file($tmp_path,$file_path)){ //移动原路径到新路径

            echo "成功<br>";

        } else{

            echo "失败<br>";

        }

    }else{

        echo "这不是一个上传文件<br>";

    }

}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容