最近项目中PHP使用的比较多,对于一个前端的使用者,对其中的一些知识点记录下来。今天讲一下,文件上传的功能实现的一些知识。之前在项目中使用的nodejs实现过类似的功能,用PHP在做的时候,发现差不多大同小异。背后的逻辑差不多都是一样的。
1.前端页面要做的是,首先是提交方式必须修改为post,因为文件上传和大数据的传输,post更合适。需要注意的地方如下:
2.然后当前端页面提交后,剩余的就是我们后端需要处理的事情了。首先获得文件的后缀名。并对文件的存放位置进行设定。
上述就是我们对上传的文件做的解析,获得到文件的后缀名和我们书写的生成随机数函数。我们通过PHP中的函数$_FILES获得我们提交文件的各个信息,然后通过pathinfo()函数得到文件的后缀名。在项目中,我使用了一个获取当前时间和随机六位数组成的一个名字作为文件的名字,通过函数move_uploaded_file()对文件的保存路径进行了调整,这样我们就获得了上传文件的并保存在我们指定的文件。这样就完成了我们项目需要的功能。当然我们还可以对文件上传的类型和大小进行一定的限制。对于出现的错误进行一定的组织和输出,这样让使用者更加的智能,我们把上述的功能进行了封装,这样我们就制作了一个简单的上传功能的模块。之前在nodejs中使用的是中间件实现的。对于PHP我们发现更多的内部写好的函数。不过实现的逻辑是一样的。
先看看我们实现随机数的函数:
//随机文件的格式 20171211 152230asdasd
function getrandname() {
$string =date('YmdHis'); //获得当前时间
for ($i = 0; $i < 6; $i++) {
switch (mt_rand(0,2)) {
case 0:
$string.=chr(mt_rand(97,112));
break;
case 1:
$string.=chr(mt_rand(65,90));
break;
case 2:
$string.=mt_rand(0,9);
break;
}
}
return $string;
}
通过上面的函数我们获得了随机的文件名字。通过我上面叙述的方式,我们完成了对上传文件的命名和存放。
$info = pathinfo($_FILES["f1"]["name"],PATHINFO_EXTENSION);
print_r($info); //获得文件名后缀
echo "
";
$str =getrandname(); //获取随机数
$dist = $str.".".$info;
print_r($dist);
echo "
";
$tmp = $_FILES["f1"]["tmp_name"];
$strmove = "d:/uploder/".$dist;
print_r($strmove);
move_uploaded_file($tmp,$strmove);
当然,对于常用的功能,我们一般都是封装成一个函数的,这样方便我们随时调用。这样我们就完成了全部的工作,现在把所有的代码附上:
'文件超过php.ini限',
'1002'=>'文件超过html限制',
'1003'=>'文件上传不完整',
'1004'=>'没有选择文件',
'1006'=>'服务器内部错误',
'1007'=>'服务器内部错误',
'1008'=>'文件太大',
'1009'=>'文件类型不合法',
'1010'=>'文件移动失败'
];
//设计者
function uploads($file,$mime,$maxsize,$path){
//判断文件上传错误
switch($file['error']){
case 1:
return 1001;//'文件超过php.ini限制';
break;
case 2:
return 1002;//'文件超过html限制';
break;
case 3:
return 1003;//'文件上传不完整';
break;
case 4:
return 1004;//'没有选择文件';
break;
case 6:
return 1006;//'服务器内部错误';
break;
case 7:
return 1007;//'服务器内部错误';
break;
}
if($file['size']>$maxsize){
return 1008; //文件太大;
}
//判断用户上传的文件类型是否合法
if(!in_array($file['type'],$mime)){
return 1009; //文件类型不合法;
}
$tmp = $file['tmp_name'];
$fileName = getRandName();
//获取文件的扩展名
$ext = pathinfo($file['name'],PATHINFO_EXTENSION);
//拼接文件名
$basename = $fileName.'.' . $ext;
//拼接路径
$dest = $path.'/'. $basename;
//将临时文件夹中的文件,移动到目标位置
if(move_uploaded_file($tmp,$dest)){
return $basename;
}else{
return 1010;
}
}
//随机文件的格式 20171211152230asdfsd
function getRandName(){
$string = date('YmdHis');
for($i=0;$i<6;$i++){
switch(mt_rand(0,2)){
case 0:
$string .= chr(mt_rand(97,122)); //小a
break;
case 1:
$string .= chr(mt_rand(65,90)); //大A
break;
case 2:
$string .= mt_rand(0,9); //获取随机数
break;
}
}
return $string;
}
//使用者
$path = "e:/uploads";
$maxsize = 1024*1024*5;
$mime = ['image/jpeg','image/jpg','image/pjpeg','image/png'];
$file = $_FILES['image'];
$return = uploads($file,$mime,$maxsize,$path);
echo $return;
这里主要做的是图片的上传。效果图如下: