>백엔드 개발 >PHP 튜토리얼 >PHP 파일 업로드 구현 및 소개 PHP 파일 업로드 코드 PHP 파일 업로드 크기 설정이란?

PHP 파일 업로드 구현 및 소개 PHP 파일 업로드 코드 PHP 파일 업로드 크기 설정이란?

WBOY
WBOY원래의
2016-07-29 08:54:181051검색

구현 및 소개는 프로그램 댓글에 있습니다.

파일 제출 페이지: (테스트를 위해 각각 doAction.php, doAction1.php, doAction2.php에 제출할 수 있음)

업로드 .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;
    }
}

위 내용은 PHP 파일 및 파일 업로드를 포함하여 PHP 파일 업로드의 구현 및 소개를 소개하고 있으며, PHP 튜토리얼에 관심이 있는 친구들에게 도움이 되기를 바랍니다.

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.