php上传文件数组,php 按照数组和步骤完成文件上传

本文详细介绍了如何在PHP中处理文件上传,包括检查错误码、判断文件大小、验证文件类型。首先,通过$_FILES数组获取上传信息,然后根据错误码给出相应错误提示。接着,限制文件大小以避免超出系统限制。再者,通过检查文件后缀名和MIME类型确保上传文件符合要求。最后,生成随机文件名并将其移动到指定目录。整个过程确保了文件上传的安全性和稳定性。
摘要由CSDN通过智能技术生成

form表单提交的文件内容指向了file.php。

我们在file.php中,通过PHP代码,来处理上传文件。

我们选择一个名为图片进行上传。假设图片的名字为:psu.jpg,点击上传。

PHP为文件类数据准备了一个专用的系统函数$_FILES,上传文件的所有相关数据,都保存在这个系统函数中。

在PHP文件中,我们打印 $_FILES ,来观察这个数组的结构:<?php

//var_dump()或print_r()

//打印变量的相关信息,将变量的信息详细的展示出来

var_dump($_FILES);

?>

打印出来的结果的数组结构如下:array (size=1)

'file' =>

array (size=5)

//文件名

'name' => string 'psu.jpg' (length=7)

//文件的mime类型

'type' => string 'image/jpeg' (length=10)

//缓存文件,上传的图片即保存在这里

'tmp_name' => string 'E:\wamp\tmp\phpC32A.tmp' (length=23)

//错误码,详见上面错误码介绍

'error' => int 0

//上传的文件大小

'size' => int 225824

得到了上面的数组结构。

我们就可以开始文件的处理过程了。

第一步,判断错误码:<?php

if($_FILES['file']['error'] > 0){

switch ($_FILES['file']['error']) {    //错误码不为0,即文件上传过程中出现了错误

case '1':

echo '文件过大';

break;

case '2':

echo '文件超出指定大小';

break;

case '3':

echo '只有部分文件被上传';

break;

case '4':

echo '文件没有被上传';

break;

case '6':

echo '找不到指定文件夹';

break;

case '7':

echo '文件写入失败';

break;

default:

echo "上传出错
";

}

}else{

//错误码为0,即上传成功,可以进行后续处理,处理流程见下文

}

?>

上面的代码详细的介绍了错误码和对应的错误,我们可以根据错误码,来生成准确的错误提示。

第二步,判断文件是否超出大小。 在实际项目中,由于系统硬件的限制,以及存储设备的限制,不可能让用户无限制的上传文件,所以我们要对用户上传的文件大小进行限制。定义一个合适的限制大小,能让我们的应用更稳定的运行。<?php

//判断错误

if ($_FILES['file']['error'] > 0) {

//有错误可停止执行

} else {

//当前上传文件无误,运行本段代码

//判断文件是否超出了指定的大小

//单位为byte

$MAX_FILE_SIZE = 100000;

if ($_FILES['file']['size'] > $MAX_FILE_SIZE) {

//判断,如果上传的文件,大小超出了我们给的限制范围,退上传并产生错误提示

exit("文件超出指定大小");

}

}

?>

将我们指定的文件大小,定义为$MAX_FILE_SIZE,该变量的计数单位为byte,对应上传文件的 $_FILES['file']['size']大小。

示例代码中,限制大小约为100K及以下的文件。

第三步,判断文件的mime类型是否正确。

更多的时候,我们的文件上传功能,都需要判断用户上传的文件,是否符合要求,不可用的文件上传以后,对于线上应用的整体展示效果,会造成恶劣的影响。所以我们需要通过mime类型和后缀名,来判断用户上传的文件是否符合要求。

下面的示例代码中,我们假设当前的项目需求为指定上传图片,要求上传后缀名为GIF或者jpg的文件,当用户上传不符合要求的文件时,返回错误提示。<?php

/*判断后缀名和MIME类型是否符合指定需求

例如:

当前项目指定上传后缀为.jpg或.gif的图片,则$allowSuffix = array('jpg','gif');

*/

//定义允许的后缀名数组

$myImg = explode('.', $_FILES['file']['name']);

/*

explode() 将一个字符串用指定的字符切割,并返回一个数组,这里我们将文件名用'.''切割,结果存在$myImg中,文件的后缀名即为数组的最后一个值

*/

$myImgSuffix = array_pop($myImg);

/*

根据上传文件名获取文件的后缀名

使用in_array()函数,判断上传文件是否符合要求

当文件后缀名不在我们允许的范围内时退出上传并返回错误信息

*/

if(!in_array($myImgSuffix, $allowSuffix)){

exit("文件后缀名不符");

}

/*

mime类型和文件后缀名的对应关系,我们可以通过很多途径查询到,为了避免用户自主修改文件后缀名造成文件无法使用。

mime类型也必须做出限制检查mime类型,是为了防止上传者直接修改文件后缀名

导致文件不可用或上传的文件不符合要求。

*/

//数组内容为允许上传的mime类型

$allowMime = array(

"image/jpg",

"image/jpeg",

"image/pjpeg",

"image/gif"

);

if(!in_array($_FILES['file']['type'], $allowMime)){                      //判断上传文件的mime类型是否在允许的范围内

exit('文件格式不正确,请检查');

//如果不在允许范围内,退出上传并返回错误信息

}

?>

第四步,生成指定的路径和文件名。

按照项目的文件安排,生成文件存储路径,为了避免文件名重复而产生的错误,按照一定的格式,生成一个随机文件名。<?php

//指定上传文件夹

$path = "upload/images/";

/*

根据当前时间生成随机文件名,本行代码是使用当前时间 + 随机一个0-9的数字组合成文件名,后缀即为前面取到的文件后缀名

*/

$name = date('Y').date('m').date("d").date('H').date('i').date('s').rand(0,9).'.'.$myImgSuffix;

?>

第五步,判断是否是上传文件。

is_uploaded_file()函数是专用的函数,来判断目标文件是否是上传文件。<?php

//使用is_uploaded_file()判断是否是上传文件,函数介绍见上文

if(is_uploaded_file($_FILEs['file']['tmp_name'])){

}

?>

第六步,移动文件到指定位置。

使用move_uploaded_file()函数,将文件移动到指定的位置,并命名。需要注意的是,Linux系统中对目标目录是否有权限及磁盘空间是否足够,否则会导致上传操作失败。<?php

/*

使用move_uploaded_file()移动上传文件至指定位置,第一个参数为上传文件,第二个参数为我们在前面指定的上传路径和名称。

*/

if(move_uploaded_file($_FILEs['file']['tmp_name'], $path.$name)){

//提示文件上传成功

echo "上传成功";

}else{

/*

文件移动失败,检查磁盘是否有足够的空间,或者linux类系统中文件夹是否有足够的操作权限

*/

echo '上传失败';

}

}else{

echo '不是上传文件';

}

}

?>

我们将这个文件片段整理成一整个文件:<?php

if ($_FILES['file']['error'] > 0) {

switch ($_FILES['file']['error']) {

//错误码不为0,即文件上传过程中出现了错误

case '1':

echo '文件过大';

break;

case '2':

echo '文件超出指定大小';

break;

case '3':

echo '只有部分文件被上传';

break;

case '4':

echo '文件没有被上传';

break;

case '6':

echo '找不到指定文件夹';

break;

case '7':

echo '文件写入失败';

break;

default:

echo "上传出错
";

}

} else {

$MAX_FILE_SIZE = 100000;

if ($_FILES['file']['size'] > $MAX_FILE_SIZE) {

exit("文件超出指定大小");

}

$allowSuffix = array(

'jpg',

'gif',

);

$myImg = explode('.', $_FILES['file']['name']);

$myImgSuffix = array_pop($myImg);

if (!in_array($myImgSuffix, $allowSuffix)) {

exit("文件后缀名不符");

}

$allowMime = array(

"image/jpg",

"image/jpeg",

"image/pjpeg",

"image/gif",

);

if (!in_array($_FILES['file']['type'], $allowMime)) {

exit('文件格式不正确,请检查');

}

$path = "upload/images/";

$name = date('Y') . date('m') . date("d") . date('H') . date('i') . date('s') . rand(0, 9) . '.' . $myImgSuffix;

if (is_uploaded_file($_FILEs['file']['tmp_name'])) {

if (move_uploaded_file($_FILEs['file']['tmp_name'], $path . $name)) {

echo "上传成功";

} else {

echo '上传失败';

}

} else {

echo '不是上传文件';

}

}

?>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值