PHP文件上传

前言

在我们日常使用中经常会遇到很多种这样的情况:

QQ空间里面上传图片呀
微信朋友圈上传图片
发邮件里面上传邮件资料附件
认证的时候要求上传照片或身份证

文件上传需要注意 php.ini 文件

配置项功能说明
file_uploadson为 开启文件上传功能,off为关闭
post_max_size系统允许的POST传参的最大值
upload_max_filesize系统允许的上传文件的最大值
memory_limit内存使用限制

建议尺寸:
file_size(文件大小) < upload_max_filesize < post_max_size < memory_limit

另外,需要注意的是脚本执行时间。
max_execution_time,这时参数的单位为秒。

这个参数是设定脚本的最大执行时间。
也可以根据需求做适当的改变。通常不需要来修改,系统默认值即可。超大文件上传的时候,可能会涉及到这一项参数的修改。

上传时间太长了,会超时。如果你将此项参数设为0,则是不限制超时时间,不建议使。

完成了php.ini的相关配置,我们就可以开始试着完成第一次文件上传了。

1. php文件上传的步骤

1、系统返回的错误码详解:

错误码说明
0无误,可以继续进行文件上传的后续操作。
1超出上传文件的最大限制,upload_max_filesize = 2M php.ini中设置,一般默认为2M。可根据项目中的实际需要来修改
2超出了指定的文件大小,根据项目的业务需求指定上传文件的大小限制
3只有部分文件被上传
4文件没有被上传
6找不到临时文件夹,可能目录不存在或没权限
7文件写入失败,可能磁盘满了或没有权限

注:错误码中没有5。

2、自定义判断是否超出文件大小范围

在开发上传功能时。我们作为开发人员,除了php.ini中规定的上传的最大值外。
我们通常还会设定一个值,是业务规定的上传大小限制。

例如:
新浪微博或者QQ空间只准单张头像图片2M。而在上传图册的时候又可以超过2M来上传。

所以说,它的系统是支持更大文件上传的。
此处的判断文件大小,我们用于限制实际业务中我们想要规定的上传的文件大小。

3、判断后缀名和mime类型是否符合

在网络世界里面也有坏人。他们会把图片插入病毒,在附件中上传病毒,他们会在网页中插入病毒或者黄色图片。

我们需要对于上传的文件后缀和mime类型都要进行判断才可以。
MIME(Multipurpose Internet Mail Extensions)是多用途互联网邮件扩展类型。是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动使用指定应用程序来打开。多用于指定一些客户端自定义的文件名,以及一些媒体文件打开方式。

在判断后缀和MIME类型的时候,我们会用到PHP的一个函数in_array(),该函数传入两个参数。

第一个参数是要判断的值;
第二个参数是范围数组。

我们用这个函数来判断文件的后缀名和mime类型是否在允许的范围内。

4、生成文件

我们的文件上传成功了,不会让它保存原名。因为,有些人在原名中有敏感关键词会违反我国的相关法律和法规。我们可以采用 date()、mt_rand() 或者 unique() 生成随机的文件名。

5、判断是否是上传文件

文件上传成功时,系统会将上传的临时文件上传到系统的临时目录中。产生一个临时文件。同时会产生临时文件名。我们需要做的事情是将临时文件移动到系统的指定目录中。
而移动前不能瞎移动,或者移动错了都是不科学的。移动前我们需要使用相关函数判断上传的文件是不是临时文件。

is_uploaded_file()传入一个参数($_FILES中的缓存文件名),判断传入的名称是不是上传文件。

6、移动临时文件到指定位置

临时文件是真实的临时文件,我们需要将其移动到我们的网站目录下面了。

让我们网站目录的数据,其他人可以访问到。
我们使用:move_uploaded_file()。

这个函数是将上传文件移动到指定位置,并命名。

传入两个参数:
第一个参数是指定移动的上传文件;
第二个参数是指定的文件夹和名称拼接的字符串。

2. php文件上传表单注意事项

代码如下:

1.index.html

<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>文件上传实例</title>
</head>
<body>
<h1>上传文件</h1>
<form action="upload.php" method="post" enctype="multipart/form-data">
    请选择文件:<input type="file" name="file" /><input type="submit" value="上传" />
</form>
</body>
</html>

注意事项:

  1. form 表单中的参数method 必须为post。若为get是无法进行文件上传的
  2. enctype须为multipart/form-data

2.upload.php

<?php

//取文件信息
$arr = $_FILES["file"];
//var_dump($arr);
//加限制条件
//1.文件类型
//2.文件大小
//3.保存的文件名不重复
if(($arr["type"]=="image/jpeg" || $arr["type"]=="image/png" ||$arr["type"]=="image/jpg") && $arr["size"]<10241000 )
{
//临时文件的路径
    $arr["tmp_name"];
//上传的文件存放的位置
//避免文件重复:
//1.加时间戳.time()加用户名.$uid或者加.date('YmdHis')
//2.类似网盘,使用文件夹来防止重复
    $filename = "./images/".date('YmdHis').$arr["name"];
    echo getcwd();

//    echo $filename.PHP_EOL;
//    echo __FILE__.PHP_EOL;
//保存之前判断该文件是否存在
    if(file_exists($filename))
    {
        echo "该文件已存在";
    }
    else
    {
        //中文名的文件出现问题,所以需要转换编码格式
        $filename = iconv("UTF-8","gb2312",$filename);
        //移动临时文件到上传的文件存放的位置(核心代码)
        //括号里:1.临时文件的路径, 2.存放的路径
        //move_uploaded_file($arr["tmp_name"]
        move_uploaded_file($arr["tmp_name"],$filename);
        echo "文件上传成功";
    }
}
else
{
    echo "上传的文件大小或类型不符";
}

?>

end

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值