PHP-实现文件上传

PHP实现文件上传与下载
文件上传的原理:通过客户端的文件上传到服务器端,再将服务器端的临时文件移动到指定的目录即可

1.文件上传配置

客户端的配置
1、表单页面
2、表单的发送方式为post
3、添加enctype=“multipart/form-data”
$_FILES中保存着上传文件的信息
·name:上传文件的名称
·type:上传文件的MIME类型(通过MIME类型 服务器可以识别上传的文件是什么类型)
·tmp_name:上传到服务器上的临时文件名
·size:上传文件的大小

2.服务器端的配置

文件上传
file_uploads = On 支持http上传
upload_tmp_dir 临时文件保存目录
upload_max_filesize 允许上传文件的最大值
max_file_uploads 允许一次上传的最大文件数
post_max_size POST方式发送数据的最大值
max_execution_time = -1设置解析器终止之前允许的最大执行时间 防止占用服务器资源
max_input_time = 60 脚本解析允许输入数据的最大时间
max_input_nesting_level = 64 设置输入变量的嵌套深度
max_input_vars = 1000,接受多少输入的变量(限制分别应用于 GET _POST和$_COOKIE超全局变量)指令的使用减轻了以哈希碰撞来进行拒绝服务攻击的可能性。如有超过指令指定数量的变量,将会导致E_WARNING的产生,更多的输入变量将会从请求中截断。
memory_limit = 128M,最大单线程的独立内存使用量。也就是一个web请求,给予线程最大的内存使用量的定义

3.上传文件错误信息说明

·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,没有文件被上传。
错误信息中没有错误信息为5的。
·UPLOAD_ERR_TMP_DIR:其值为6,找不到临时文件夹。
·UPLOAD_ERR_CANT_WRITE:其值为7,文件写入失败。
·UPLOAD_ERR_EXTENSION:其值为8,上传的文件被PHP扩展程序中断。

判断下错误号,只有为0或者是UPLOAD_ERR_OK,没有错误发生,上传成功

客户端限制:
·通过表单隐藏域限制上传文件的最大值

·通过accept属性限制上传文件类型

缺点:客户端做的限制对于会程序的人来说没有用。

4.服务器端限制文件上传类型

ext=strtolower(end(explode(., fileInfo[‘name’]))); //截取点后字符串
ext=pathinfo( fileInfo[‘name’],PATHTNFO_EXTENSION) //截取点后字符串

服务器端检测 文件是否是以HTTP POST方式上传的
is_uploaded_file( fileInfo[tmpname])moveuploadedfile( fileInfo['tmp_name'],$destination)
在move前加@表示抑制警告产生

服务器端确保 文件不重名
path=; uniName = md5(uniqid(microtime(true),true)).'.'. ext;// ext之前获取的文件后缀名
destination= path.’/’.$uniName; 文件保存的目录和文件名

服务器端 指定目录不存在创建该目录
path=uploads;//if(!fileexists( path)){ file_exists判断该目录是否存在
mkdir( path,0777,true);//chmod( path,0777); //修改权限
}
getimagesize 检测是否是真实的图片文件
如果是 返回一个数组
如果不是 则返回bool(false)

upload.php

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>PHP文件上传与下载</title>
</head>
<body>
    <form action="doAction.php" method="post" enctype="multipart/form-data">
        请选择您要上传的文件:
        <input type="file" name="myFile" id=""><br/>
        <input type="submit" value="上传文件">
    </form>
</body>
</html>

doAction.php

<?php
    //$_FILES 预定义文件上传变量
    /*print_r($_FILES);*/
    header('content-type:text/html;charset=utf-8');
    require_once('upload.func.php');
    $fileInfo = $_FILES['myFile'];
    echo uploadFile($fileInfo);

    //将服务器上的临时文件移动到指定目录下(两种方法)
    /*move_uploaded_file($tmp_name,$destination);移动成功返回true,否则返回false;该方法只用于POST表单上传的情况
    move_uploaded_file($tmp_name, './uploads/'.$filename);
    copy($src,$dst) 将文件拷贝到指定目录下,拷贝成功返回true,否则返回true
    copy($tmp_name, './uploads'.$filename);
*/

?>

upload.func.php

<?php

    //封装单文件上传函数
    function uploadFile($fileInfo,$uploadPath='uploads',$flag=true,$allowExt=array('jpg','jpeg','gif','png'),$maxSize=2097152){
        //检测错误号
            if($fileInfo['error']>0){
                switch ($fileInfo['error']) {
                    case 1:
                        $mes = '上传的文件超过了服务端配置中upload_max_filesize选项限制的值';
                        break;
                    case 2:
                        $mes = '上传的文件超过了HTML表单POST中MAX_FILE_SIZE选项限制的值';
                        break;
                    case 3:
                        $mes = '文件只有部分被上传';
                        break;  
                    case 4:
                        $mes = '没有任何文件被上传';
                        break;  
                    case 6:
                        $mes = '找不到临时的文件夹';
                        break;  
                    case 7:
                    case 8:
                        $mes = '系统文件错误';
                        break;      
                }
                exit($mes);
            }

        //检测上传文件的类型
        //$ext = strtolower(end(explode(',',$fileInfo['name'])));截取name后的字符串
            $ext = pathinfo($fileInfo['name'],PATHINFO_EXTENSION);
            /*$allowExt = array('jpg','jpeg','gif','png');*/
            if(!in_array($ext,$allowExt)){
                exit('非法类型的文件');
            }

        //检测上传的文件大小是否符合要求
            /*$maxSize = 2097152; //自定义2M*/
            if($fileInfo['size']>$maxSize){
                exit('文件过大,不符合规范');
            }
        //检测文件是否是正确的图片文件
            if($flag){
                if(!getimagesize($fileInfo['tmp_name'])){
                    exit('不是正确的图片类型');
                }
            }
        //检测文件是否是HTTP POST方式上传的
            if(!is_uploaded_file($fileInfo['tmp_name'])){
                exit('文件不是以HTTP POST方式上传的');
            }
        //移动临时文件
        /*$uploadPath = 'uploads';*/
        $uniqName = md5(uniqid(microtime(true),true)).".".$ext;
        $destination = $uploadPath."/".$uniqName;
            if(!file_exists($uploadPath)){
                mkdir($uploadPath,0777,true);
                chmod($uploadPath, 0777);
            }
            if(!@move_uploaded_file($fileInfo['tmp_name'], $destination)){
                exit('文件上传失败');
            }
        return $destination;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值