php文件上传详解

原理

在我们点击提交时,被保存在php.ini文件中的upload_tmp_dir指定的临时目录中。必须将它从临时目录中删除或移动到其它地方,如果没有,则会被删除。也就是不管是否上传成功,脚本执行完后临时目录里的文件肯定会被删除。所以在删除之前要用PHP的move_upload_to() 函数将它复制到其它位置,此时,才算完成了上传文件过程。

配置

在上传文件之前我们需要配置我们的php.ini文件
(我的版本我php7.2)

#是否允许HTTP文件上传。默认值为On允许HTTP文件上传,此选项不能设置为Off。
file_uploads = On
#文件上传的临时存放目录。如果没指定则PHP会使用系统默认的临时目录。
#该选项默认为空,此选项在手动配置PHP运行环境时,也容易遗忘,
#如果不配置这个选项,文件上传功能就无法实现,你必须给这个选项赋值,  
upload_tmp_dir ="D:/wamp/tmp"
# 上传文件的最大尺寸。这个选项默认值为2M,即文件上传的大小为2M
#如果你想上传一个50M的文件,你必须设定 upload_max_filesize = 50M。
#但是仅设置upload_max_filesize = 50M,还是无法实现大文件的上传功能,
#我们还必须修改php.ini文件中的 post_max_size 选项。
upload_max_filesize = 2M
#指通过表单POST给PHP的所能接收的最大值,包括表单里的所有值。
#默认为8M。如果POST数据超出限制,那么$_POST和$_FILES将会为空。
#要上传大文件,你必须设定该选项值大于upload_max_filesize选项的值,
post_max_size = 8M

我们服务器的服务器就算配置好了。我们来写一下前端页面

前端页面搭建

<form action="test.php" method="post" enctype="multipart/form-data">
    <input type="file" name="file">
    <input type="submit" value="上传">
</form>

一个非常简单的一个表单

注意点

文件上传只能用post方式来上传,enctype的编码模式必须为multipart/form-data

php代码

在文件上传之后我们应该验证文件是否上传有错误


if ($_FILES['file']['error'] > 0) {
    echo '文件上传失败:';
    switch ($_FILES['file']['error']) {
        case 1 :
            echo '文件上传大小超过php.ini最大限制';
            break;
        case 2:
            echo '文件上传大小超过HTML设置的最大限制';
            break;
        case 3:
            echo '文件只有部分被上传';
            break;
        case 4:
            echo '文件为空';
            break;
        case 6:
            echo '不能上传文件,文件的临时目录没有';
            break;
        case 7:
            echo '上传失败:不能写在磁盘上';
            break;
        case 8:
            echo '上传文件的拓展没有被打开';
            break;
    }
}

这里我们用到了$_FILES数组全局变量,他的内容如下

$_FILES['myFile']['name']     客户端文件的原名称       

  $_FILES['myFile']['type']       文件的 MIME类型,需要浏览器提供该信息的支持,例如"image/gif"       

  $_FILES['myFile']['size']        已上传文件的大小,单位为字节       
  
   $_FILES['myFile']['tmp_name']   文件被上传后在服务端储存的临时文件名,一般是系统默认,可以在php.ini的upload_tmp_dir指定,但用 putenv() 函数设置是不起作用的     

  $_FILES['myFile']['error']             和该文件上传相关的错误代码,没有错误返回的结果为0.有的话就如上面代码所示

如果没有错误的话我们就可以根据我们的文件类型、大小、等进行判断是否进行文件的转移。

if ($_FILES['file']['type'] != 'image/png') {
    echo '上传的文件不是PNG图像';
    exit;
}
if ($_FILES['file']['size'] > 366*144) {
    echo '上传的图像太大了';
    exit;
}

当满足了我们的检测要求了,我们就可以开始进行转义我们的文件了。

扫描二维码关注公众号,回复: 2282547 查看本文章
    $uploaded_file=$_FILES['file']['tmp_name'];

    //我们给每个用户动态的创建一个文件夹
    $user_path=$_SERVER['DOCUMENT_ROOT']."/file/";
    //判断该用户文件夹是否已经有这个文件夹
    if(!file_exists($user_path)) {
        mkdir($user_path);
    }
    $move_to_file=$user_path."/".time().rand(1,1000).substr($file_true_name,strrpos($file_true_name,"."));
    if(is_uploaded_file($_FILE['myfail']['tmp_name')){
        if(move_uploaded_file($uploaded_file,$move_to_file)) {
            echo $_FILES['file']['name']."上传成功";
        } else {
            echo "上传失败";
        }
    }else{
        echo '文件没有被上传';
        exit;
    }

在这里我们用is_uploaded_file()函数来判断指定的文件是否是通过 HTTP POST 上传的

该函数可以用于确保恶意的用户无法欺骗脚本去访问本不能访问的文件,例如 /etc/passwd。

这种检查显得格外重要,如果上传的文件有可能会造成对用户或本系统的其他用户显示其内容的话。

move_uploaded_file( u p l o a d e d f i l e , move_to_file)把文件从临时文件移动到指定文件中去

猜你喜欢

转载自blog.csdn.net/qq_36172443/article/details/80179917