我们了解了表单传值后,这些我就可以完成PHP的文件上传了。我们了解PHP文件上传前,先了解PHP文件上传的原理。
我们用表单post方式上传文件时,文件会保存在临时目录你,那后台PHP如何接收得到这临时文件的信息?使用$_POST?不是的,这时候我我们后台需要使用超全局变量 $_FILES来接收文件信息,我们可以直接使用 $_FILES或者 $_FILES[‘name对应的名称’]接收,这接收的是一个数组,我们可以使用 var_dump() 或 print_r() 来查看上传的临时文件的信息;如下图:
对于上面error字段的错误信息说明,php官方手册上给出了解释:
我们知道如何获取临时文件信息后,根据原理我们只需要做以下几件事就可以实现文件上传功能:
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>Examplestitle>
head>
<body>
<form action="upload.php" method="post" enctype="multipart/form-data">
<label for="myfile">上传文件:label>
<input type="file" id="myfile" name="myfile">
<br>
<input type="submit" value="提交">
form>
body>
html>
/*
* Created by phpstrom
* USER: 冷魅蘇
* Date: 2019/4/27
* Time: 17:02
*/
echo ''
;
//得到临时文件
$tmpName = $_FILES['myfile']['tmp_name'];
//对应保存的目录
$fileName = 'E:/uploads/'. $_FILES['myfile']['name'];
//移动临时文件到目录
move_uploaded_file($tmpName,$fileName);
开心,文件上传已经实习了,但问题很大。
上述的文件上传我们是已经实习了,但有几点问题:
下面直接给出修改后的代码,具体思路代码注释里面有说明:
/*
* Created by phpstrom
* USER: 冷魅蘇
* Date: 2019/4/25
* Time: 22:15
*/
/**
* @param $file 前台post提交的文件信息
* @param $mime 定义上传文件的类型
* @param $maxSize 定义上传文件的大小
* @param $path 定义保存的路径
* @return 返回上传成功的文件名或错误信息码
*/
function upload($file,$mime,$maxSize,$path){
//检查是否有该文件夹,如果没有就创建,并给予最高权限
if (!file_exists ($path)) {
if (!mkdir ("$path", 0777, true)) { //创建文件夹,没成功返回4010
return 4010;
}
}
//判断文件上传到临时目录的错误
switch ($file['error']){
case 1:
return 4001; //'上传的文件超过了 php.ini 中 upload_max_filesize 选项限制的值'
break;
case 2:
return 4002; //'上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值'
break;
case 3:
return 4003; //'文件上传不完整'
break;
case 4:
return 4004; //'没有文件被上传'
break;
case 6:
return 4005; //'服务器内部错误,文件写入失败'
break;
case 7:
return 4006; //'服务器内部错误,文件写入失败'
break;
}
if ($file['size']>$maxSize){
return 4007; //'文件上传大小超过限制'
}
//判断用户的上传文件的类型是合法,in_array() 数组查询
if (!in_array($file['type'],$mime)){
return 4008; //"上传文件必须是图片"
}
//得到临时文件名
$tmp = $file['tmp_name'];
//调用函数生成随机的文件名
$fileName = getRandFileName();
//获取文件的扩展名
$ext = pathinfo($file['name'],PATHINFO_EXTENSION);
//拼接成保存的文件名
$baseName = $fileName.'.'.$ext;
//拼接路径
$destination = $path.$baseName;
//如果文件合法,则将临时文件夹中的文件移动到指定的文件夹,并指定文件名
if (move_uploaded_file($tmp,$destination)){
return '上传成功,保存的文件名为:'.$baseName;
}else{
return 4009;
}
}
/**
* 随机文件名的格式,时间戳+随机6位的大小写字母和数字的组合
* mt_rand(x,y) x,y的随机整数
* chr 字符转换
* ASCII码表:97-122 小写字母 65-90大写字母
*/
function getRandFileName(){
//将时间戳转成我们想要的格式
$str = date('YmdHis',time());
for($i=0; $i<6; $i++){
switch (mt_rand(0,2)){ //随机从小写字母、大写字母、数字取一个
case 0:
$str .= chr(mt_rand(97,122));
break;
case 1:
$str .= chr(mt_rand(65,90));
break;
case 2:
$str .= mt_rand(0,9);
break;
}
}
return $str;
}
//文件上传信息手册
$errorInfo = [
'4001' => '上传的文件超过了 php.ini 中 upload_max_filesize 选项限制的值',
'4002' => '上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值',
'4003' => '文件上传不完整',
'4004' => '没有文件被上传',
'4005' => '服务器内部错误,文件写入失败',
'4006' => '服务器内部错误,文件写入失败',
'4007' => '文件上传大小超过限制',
'4008' => '上传文件必须是图片',
'4009' => '文件从临时文件夹移动到上传文件夹失败',
'4010' => '保存文件的目录创建失败,请确定目录是否合法'
];
//文件保存的文件夹
$path = 'E:/uploads/';
//定义文件上传的大小3MB
$maxSize = 1024*1024*3;
//定义允许用户上传的mime类型,现控制在图片上传
$mime = ['image/jpeg','image/jpg','image/pjpeg','image/png','image/gif'];
$file = $_FILES['myfile'];
$res = upload($file,$mime,$maxSize,$path);
echo ''
;
echo '临时文件上传信息
';
var_dump($_FILES['myfile']);
echo '错误信息手册,显示文件名称上传成功
';
var_dump($errorInfo);
echo $res;
说明:文件类型(MIME)
常见的几种类型:
欢喜,我们的文件上传功能就此完成。下面我们说明一下对于文件上传,php.ini的相关配置,php.ini文件就在你安装的php目录下。
1. upload_tmp_dir //修改上传文件的临时目录
upload_max_filesize //上传允许的单文件的最大值
max_file_uploads //上传文件的允许最大数量
2. post_max_size //上传所有文件字节允许的最大值
声明:本文欢迎大家评论和转载,使用本文章或代码还请声明,且在使用处的明显位置给出。如有其它问题或有什么建议,可在下方评论,或加QQ(1414782205),或发邮箱[email protected]。