PHP文件上传

文件上传可以通过HTTP协议来实现。要使用文件上传功能,首先要在配置文件php.ini中对上传做一些设置,然后通过预定义常量$_FILES对上传文件做一些限制和判断;最后通过move_uploaded_file()函数实现上传。

配置php.ini文件
实现上传功能,首先要在php.ini中开启文件上传,并对其中的一些参数作出合理的设置,找到 File Uploads 项,可以看到下面的3个属性值,表示的含义如下。
1、file_uploads:如果值是on,说明服务器支持文件上传,如果为off,则不支持。
2、upload_tmp_dir:上传文件临时目录。在文件被成功上传之前,文件首先存放到服务器端的临时目录中。如果要指定位置,就在这里进行设置。否则使用系统默认目录即可。
3、 upload_max_filesize:服务器允许上传文件的最大值,以MB为单位。系统默认为2MB,用户可以自行设置。
除了File Uploads项,还有几个属性也会影响到上传文件的功能。
4、max_execution_time:PHP中一个指令所能执行的最大时间,单位是秒。
5、memory_limit:PHP中一个指令所分配的内存空间,单位是MB。
php.ini文件配置完成后,需要重新启动Apache,配置才能生效


预定义变量$_FILES
$_FILES变量存储的是上传文件的相关信息,这些信息对于上传功能有很大的作用。该变量是一个二维数组。
保存的信息如下表
元素名称
说明
$_FILES[filename][name]
存储了上传文件的文件名,如test.txt,tu.jpg
$_FILES[filename][size]
存储了文件大小,单位为字节

$_FILES[filename][tmp_name]

文件上传时,首先在临时目录中被保存成一个临时文件。该变量为临时文件名。
$_FILES[filenam][type]
上传文件的类型。
$_FILES[filename][error]
存储了上传文件的结果。如果返回0,则说明文件上传成功。

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; 上传文件大小为0         


注意:

用form上传文件时,一定要加上属性内容enctype="multipart/form-data",否则用$_FILES[filename]获取文件信息时会报异常。

     

例如:
实现一个上传文件域,通过$_FILES变量输出上传文件的资料,代码如下:

<form action="" method="post" enctype="multipart/form-data">
<!--上传文件域,type类型为file-->
<input type="file"  name="upfile">
<!--提交按钮-->
<input type="submit" name="submit" value="上传">
</form>
<!--处理表单返回结果-->
<?php
    if(!empty($_FILES)){
foreach($_FILES['upfile'] as $name=>$value){
echo $name.'='.$value.'<br>';
        }
    }
?>

运行结果为:

PHP文件上传_第1张图片
文件上传函数
PHP中应用move_uploaded_file()函数实现文件上传。
move_uploaded_file()函数将指定文件上传到服务器中指定的位置。如果成功则返回true,否则返回false。语法如下:
bool move_uploaded_file(string filename,string destination)
参数filename指定上传文件的临时文件名,即$_FILES[tmp_name];参数destination指定文件上传后保存的新路径和名称。
例如:
前提需要先创建upfile文件夹
创建一个上传表单,允许上传2MB以下、格式为JPG的图片文件,将上传文本保存在根目录下的upfile文件夹下,上传成功浏览该目录,代码如下:
<meta charset="UTF-8">
<!--上传表单必须要有enctype属性-->
<form action="" method="post" enctype="multipart/form-data">
    <!--上传文件域,type类型为file-->
    <input type="file"  name="up_file">
    <!--提交按钮-->
    <input type="submit" name="submit" value="上传">
</form>
<!--处理表单返回结果-->
<?php
    if(!empty($_FILES[up_file][name])){//判断是否有上传文件
        $fileinfo=$_FILES[up_file];//将文件信息赋给变量$fileinfo
        $type=strstr($fileinfo['name'],'.');
        if($type!=".jpg"){
            echo "您上传的文件格式不正确!";
        }else{
            if($fileinfo['size']<2097152&&$fileinfo['size']>0){//判断文件大小
                $path="upfile/".$_FILES["up_file"]["name"];//定义上传文件的路径
                move_uploaded_file($fileinfo['tmp_name'],$path);//上传文件
                //上传成功后浏览该目录
                if(is_dir("upfile/")){//判断文件名是否为目录
                    $dir=scandir("upfile/");//使用scandir()函数取得所有文件和目录
                    foreach($dir as $value){
                        echo $value.'<br>';
                    }
                }else{
                    echo '目录路径错误!';
                }
            }else{
                echo "文件大小不符合要求";
            }
        }
    }
?>

运行结果如下:

注:
此方法上传图片的时候,在电脑上看文件名的时候会中文乱码(因为电脑上中文是用gb2312编码的)
我提供了两种解决方案:
1:转换编码,将名字换成gb2312,然后重新命名文件名,读取的时候再转换成UTF-8
if(!empty($_FILES[up_file][name])){//判断是否有上传文件
    $fileinfo=$_FILES[up_file];//将文件信息赋给变量$fileinfo
    $type=strstr($fileinfo['name'],'.');
    if($type!=".jpg"){
        echo "您上传的文件格式不正确!";
    }else{
        if($fileinfo['size']<2097152&&$fileinfo['size']>0){//判断文件大小
            $file_name=iconv("UTF-8","gb2312", $_FILES["up_file"]["name"]);//将UTF-8编码转换成gb2312
            $path="upfile/".$file_name;//定义上传文件的路径
            move_uploaded_file($fileinfo['tmp_name'],$path);//上传文件
            //上传成功后浏览该目录
            if(is_dir("upfile/")){//判断文件名是否为目录
                $dir=scandir("upfile/");//使用scandir()函数取得所有文件和目录
                foreach($dir as $value){
                    echo iconv("gb2312","UTF-8", $value).'<br>';//将gb2312编码转换成UTF-8
                }
            }else{
                echo '目录路径错误!';
            }
        }else{
            echo "文件大小不符合要求";
        }
    }
}

2:重新命名文件名为英文+数字的组合(可以利用时间起名字)










你可能感兴趣的:(文件上传,PHP,文件处理)