Home >Backend Development >PHP Tutorial >Implementation and introduction of PHP file upload What is a php file? PHP file upload code PHP file upload size setting

Implementation and introduction of PHP file upload What is a php file? PHP file upload code PHP file upload size setting

WBOY
WBOYOriginal
2016-07-29 08:54:181052browse

The implementation and introduction are in the program comments.

Page to submit files: (can be submitted to doAction.php, doAction1.php, doAction2.php respectively for testing)

upload.php

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>文件上传</title>
</head>
<body>
    <form action="doAction3.php" method="post" enctype="multipart/form-data">
        <!-- 在客户端可以设置表单MAX_FILE_SIZE限制的大小 -->
        <!--<input type="hidden" name="MAX_FILE_SIZE" value="5*1024*1024">-->
        请选择您要上传的文件:
        <!-- 在客户端设置允许上传的文件类型 --><!-- 但是我们需要记住:客户端所做的任何限制都是不安全的 -->
        <!--<input type="file" name="myFile" accept="image/jpeg,image/gif,image/png"/><br/>-->
        <input type="file" name="myFile"/><br/>
        <input type="submit" value="上传文件"/>
    </form>
</body>
</html>

doAction.php

<?php
/**
 * Created by PhpStorm.
 * User: DreamBoy
 * Date: 2016/4/8
 * Time: 15:17
 */
//$_FILES:文件上传变量
/*
 * $_FILES中保存着上传文件的信息
 * name:上传文件的名称
 * type:上传文件的MIME类型
 * tmp_name:上传到服务器上的临时文件名
 * size:上传文件的大小
 * error:上传文件的错误号
 */
print_r($_FILES);
$filename = $_FILES[&#39;myFile&#39;][&#39;name&#39;];
$type = $_FILES[&#39;myFile&#39;][&#39;type&#39;];
$tmp_name = $_FILES[&#39;myFile&#39;][&#39;tmp_name&#39;];
$size = $_FILES[&#39;myFile&#39;][&#39;size&#39;];
$error = $_FILES[&#39;myFile&#39;][&#39;error&#39;];

//上传方式
//第一种方式:
//将服务器上的临时文件移动到指定目录下,移动成功返回true,否则返回false。
//move_uploaded_file($tmp_name, $destination);
//move_uploaded_file($tmp_name, &#39;uploads/&#39; . $filename);

//第二种方式:
//copy($src,$dst) :将文件拷贝到指定目录,拷贝成功返回true,否则返回false
//copy($tmp_name, &#39;uploads/&#39; . $filename);

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

/*
 * 错误信息说明
 * UPLOAD_ERR_OK:其值为0,没有错误发生,文件上传成功
 * UPLOAD_ERR_INT_SIZE:其值为1,上传的文件超过了php.ini中uploaded_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,找不到临时文件夹。
 * UPLOAD_ERR_CANT_WRITE:其值为7,文件写入失败。
 * UPLOAD_ERR_EXTENSION:其值为8,上传的文件被PHP扩展程序中断。
 */

doAction1.php

<?php
header(&#39;content-type:text/html;charset=utf-8&#39;);
/**
 * Created by PhpStorm.
 * User: DreamBoy
 * Date: 2016/4/8
 * Time: 16:37
 */
//1.通过$_FILES文件上传变量接收上传文件信息
$fileInfo = $_FILES[&#39;myFile&#39;];
$filename = $fileInfo[&#39;name&#39;];
$type = $fileInfo[&#39;type&#39;];
$tmp_name = $fileInfo[&#39;tmp_name&#39;];
$size = $fileInfo[&#39;size&#39;];
$error = $fileInfo[&#39;error&#39;];
//2.判断下错误号,只有为0或者是UPLOAD_ERR_OK,没有错误发生,上传成功。
if($error == UPLOAD_ERR_OK) {
    if(move_uploaded_file($tmp_name, &#39;uploads/&#39; . $filename)) {
        echo &#39;文件&#39; . $filename . &#39;上传成功&#39;;
    } else {
        echo &#39;文件&#39; . $filename . &#39;上传失败&#39;;
    }
} else {
    //匹配错误信息
    switch($error) {
        case 1:
            echo &#39;上传文件超过了PHP配置文件中upload_max_filesize选项的值&#39;;
            break;
        case 2:
            echo &#39;超过了表单MAX_FILE_SIZE限制的大小&#39;;
            break;
        case 3:
            echo &#39;文件部分被上传&#39;;
            break;
        case 4:
            echo &#39;没有选择上传文件&#39;;
            break;
        case 6:
            echo &#39;没有找到临时目录&#39;;
            break;
        case 7:
        case 8:
            echo &#39;系统错误&#39;;
            break;
    }
}

/*
 * 上传文件限制
 * 服务器端限制:
 * 限制上传文件大小
 * 限制上传文件类型
 * 检测是否为真是图片类型
 * 检测是否为HTTP POST方式上传
 */

doAction2.php

<?php
/**
 * Created by PhpStorm.
 * User: DreamBoy
 * Date: 2016/4/8
 * Time: 17:45
 */

header(&#39;content-type:text/html;charset=utf-8&#39;);
$fileInfo = $_FILES[&#39;myFile&#39;];
$maxSize = 2097152; //2 * 1024 * 1024;
$allowExt = array(&#39;jpeg&#39;, &#39;jpg&#39;, &#39;png&#39;, &#39;gif&#39;, &#39;wbmp&#39;);
$flag = true; //检测是否为真实图片类型

//1.判断错误号
if($fileInfo[&#39;error&#39;] == 0) {
    //判断上传文件的大小
    if($fileInfo[&#39;size&#39;] > $maxSize) {
        exit('上传文件过大');
    }

    echo $fileInfo['type']; exit;

    //$ext = strtolower(end(explode('.', $fileInfo['name'])));
    $ext = pathinfo($fileInfo['name'],PATHINFO_EXTENSION);
    if(!in_array($ext, $allowExt)) {
        exit('非法文件类型');
    }

    //判断文件是否是通过HTTP POST方式上传来的
    if(!is_uploaded_file($fileInfo['tmp_name'])) {
        exit('文件不是通过HTTP POST方式上传来的');
    }

    //检测是否为真实的图片类型
    /*
     * getimagesize($filename):得到指定图片的信息,如果是图片返回数组
     * 如果不是图片(哪怕文件的后缀是图片的格式,实际上不是图片的话),返回false。
     */
    if($flag) {
        if(!getimagesize($fileInfo['tmp_name'])) {
            exit('不是真正的图片类型');
        }
    }

    $path = 'uploads';
    //php利用mkdir创建多级目录 http://www.daixiaorui.com/read/38.html
    /*
     * mkdir($path,0777,true);
     * 第一个参数:必须,代表要创建的多级目录的路径;
     * 第二个参数:设定目录的权限,默认是 0777,意味着最大可能的访问权;
     * 第三个参数:true表示允许创建多级目录。
     */
    /*
     * chmod() 函数改变文件模式。
     * 如果成功则返回 TRUE,否则返回 FALSE。
     */
    if(!file_exists($path)) {
        mkdir($path, 0777, true); // 0777表示可读可写可执行
        chmod($path, 0777);
    }
    //确保文件名位移,放置重名产生覆盖
    /*
     * uniqid() 函数基于以微秒计的当前时间,生成一个唯一的 ID。
     * 语法
     * uniqid(prefix,more_entropy)
     * 参数	描述
     * prefix	可选。为 ID 规定前缀。如果两个脚本恰好在相同的微秒生成 ID,该参数很有用。
     * more_entropy	可选。规定位于返回值末尾的更多的熵。
     */
    /*
     * microtime()返回当前 Unix 时间戳和微秒数。
     * PHP函数microtime()语法
     * microtime(get_as_float)
     * PHP函数microtime()参数与描述
     * get_as_float 如果给出了 get_as_float 参数并且其值等价于 TRUE,该函数将返回一个浮点数。
     * 通俗地说,带参数true表明只返回一个浮点数(即秒数),不带参数返回一个微秒+秒的字符串。
     * <?php
     * echo microtime();
     * echo "<br>";
     * echo microtime(true);
     * ?>
     * 结果如下:
     * 0.00000600 1283757623
     * 1283757623
     */
    $uniName = md5(uniqid(microtime(true), true)) . '.' . $ext;
    //$destination = $path . '/' . $fileInfo['name'];
    $destination = $path . '/' . $uniName;

    if(@move_uploaded_file($fileInfo['tmp_name'], $destination)) {
        echo '文件上传成功';
    } else {
        echo '文件上传失败';
    }
} else {
    //匹配错误信息
    switch($fileInfo['error']) {
        case 1:
            echo '上传文件超过了PHP配置文件中upload_max_filesize选项的值';
            break;
        case 2:
            echo '超过了表单MAX_FILE_SIZE限制的大小';
            break;
        case 3:
            echo '文件部分被上传';
            break;
        case 4:
            echo '没有选择上传文件';
            break;
        case 6:
            echo '没有找到临时目录';
            break;
        case 7:
        case 8:
            echo '系统错误';
            break;
    }
}

The above introduces the implementation and introduction of PHP file upload, including PHP files and file upload. I hope it will be helpful to friends who are interested in PHP tutorials.

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn