• PHP上传文件(附带源码)

    将 input 表单的 type 属性设置为file即可向服务器上传文件,服务端使用 PHP 接收文件数据和接收普通表单元素数据的处理方法稍有不同,下面我们来演示一下:

    form 表单的写法:

    <form action="user.php" enctype="multipart/form-data" method="post" name="upvideo">
        上传文件:<input type="file" name="video" />  <!-- 将 type 属性设置为 file -->
        <input type="submit" value="上传" />
    </form>

    上传文件的表单必须在 form 中定义 enctype="multipart/form-data"。

    此时用于接收文件信息的 PHP 代码如下:

    <?php
        var_dump($_POST);
        var_dump($_FILES);
        if ($_FILES["video"]["error"] > 0){
            echo "Error: " . $_FILES["video"]["error"] . "<br />";
        } else {
            print_r($_FILES["video"]);
            if(is_uploaded_file($_FILES['video']['tmp_name'])){
            $upfile=$_FILES["video"];
            //获取数组里面的值
            $name=$upfile["name"];//上传文件的文件名
            $type=$upfile["type"];//上传文件的类型
            $size=$upfile["size"];//上传文件的大小
            $tmp_name=$upfile["tmp_name"];//上传文件的临时存放路径
            // 移动上传的文件到指定目录
            move_uploaded_file($tmp_name, '/Library/WebServer/Documents/book/'.$name);
            }
        }
    ?>

    执行上述上传文件操作,打印结果如下:

    array(0) { }

    array(1) {
        ["video"]=> array(5)
        {
            ["name"]=> string(14) "linux icon.gif"
            ["type"]=> string(9) "image/gif"
            ["tmp_name"]=> string(26) "/private/var/tmp/phpyiMCwf"
            ["error"]=> int(0)
            ["size"]=> int(15712)
        }
    }

    Array
    (
        [name] => linux icon.gif
        [type] => image/gif
        [tmp_name] => /private/var/tmp/phpyiMCwf
        [error] => 0
        [size] => 15712
    )

    第一个数组为空,表明在使用 file 类型表单提交数据时并不使用 $_POST 接收数据,而是使用全局变量 $_FILE 来接收。

    PHP 中使用 move_uploaded_file 函数将上传的文件移动到指定位置。

    在 PHP 配置文件 php.ini 中默认上传文件的大小只有 2MB,在上传大文件时需要对配置文件进行修改。

    php.ini 中有关上传文件的设置如下:

    选项 说明
    file_uploads 是否允许 HTTP 文件上传,默认值为 On,允许 HTTP 文件上传,此选项不能设置为 Off。
    upload_tmp_dir 文件上传的临时存放目录。如果没指定,那么 PHP 会使用系统默认的临时目录。该选项默认为空,如果不配置这个选项,文件上传功能就无法实现。
    upload_max_filesize 上传文件的最大尺寸。这个选项默认值为 2MB,即文件上传的大小为 2MB,如果想上传一个 50MB 的文件,就必须设定 upload_max_filesize=50M。

    仅设置 upload_max_filesize=50M 还是无法实现大文件的上传功能,还必须修改 php.ini 文件中的 post_max_size 选项。

    post_max_size 通过表单 POST 给 PHP 所能接收的最大值,包括表单里的所有值,默认为 8MB。如果 POST 数据超出限制,那么 $_POST 和 $_FILES 将会为空。

    要上传大文件,必须设定该选项值大于 upload_max_filesize 选项的值,例如设置了 upload_max_filesize=50M,这里就可以设置 post_max_size=100M。

    如果启用了内存限制,那么该值应当小于 memory_limit 选项的值。

    max_execution_time 每个 PHP 页面运行的最大时间值(单位秒),默认为 30 秒。如果设置为 0,就表示无时间限制。

    当我们上传一个较大的文件时,例如 50MB,很可能要几分钟才能上传完,但 PHP 默认页面最久执行时间为 30 秒,超过 30秒该脚本就停止执行,导致出现无法打开网页的情况。因此我们可以把值设置得较大些,如 max_execution_time=600。

    max_input_time 每个 PHP 脚本解析请求数据所用的时间(单位秒),默认为 60 秒。当我们上传大文件时,可以将这个值设置得较大些。如果设置为 0,就表示无时间限制。
    memory_limit 这个选项用来设置单个 PHP 脚本所能申请到的最大内存空间。这有助于防止写得不好的脚本消耗光服务器上的可用内存。如果不需要任何内存上的限制将其设为 -1。

    php.ini 配置上传文件功能示例

    假设要上传一个 50MB 的大文件,php.ini 配置如下:

    file_uploads = On
    upload_tmp_dir = "/user/file"
    upload_max_filesize = 50M
    post_max_size = 100M
    max_execution_time = 600
    max_input_time = 600
    max_input_time = 600

更多...

加载中...