PHP 文件上传功能 这其中需要先知道这些函数(方法)的作用
$_FILES[] //用来接收文件信息
is_dir() //判断一个目录是否存在
mkdir() //创建目录
time() //获取当前时间戳
in_array() //判断一个元素在不在一个数组内
rand()/mt_rand() //取随机数
move_uploaded_file(a,b) // 将A文件移动到B文件
单文件上传 (注释已经写得很清楚了 认真读不难理解)
HTML部分
文件上传功能
单文件
upload.php :
"成功,没有错误",
1=>"上传的文件超过了 php.ini 中 upload_max_filesize选项限制的值。",
2=>"上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值。",
4=>"文件有部分没有上传",
5=>"文件没有被上传",
6=>"找不到临时文件夹",
7=>"文件写入失败"
];
// 定义文件类型 没有则去掉下面判断文件类型的一层if
$filesType = array("image/jpeg","image/jpg","image/png","image/gif","image/pjpeg","image/x-png");
// 规定文件上传大小 单位 (MB) , 为 0 则不限制大小
$size = 4;
// 接受传进来的文件数据
$file = $_FILES['tu1'];
// 定义文件上传路径
$path = "testUpload/";
// 获取目录名称
$path1 = rtrim($path,"/");
if(!is_dir($path1)){ // 判断上传目录是否存在 , 不存在则自动创建
mkdir($path1,"0777");
}
// 空数组 用来存储信息
$info = [];
$info['isok'] = false;
if($file['error'] > 0){ // 判断文件上传是否出错
$info['msg'] = $errorMeg[$file['error']];
}else{
if(!in_array($file['type'],$filesType)){ //判断文件格式是否正确
$info['msg'] = "文件格式不正确!";
}else{
if(($file['size']/1024/1024) > $size){ //判断文件大小是否符合
$info['msg'] = "文件限定大小为"."(".$size."MB)";
}else{
// 开始上传文件
// 定义文件名 时间戳+随机数+文件名 , 这样写文件名一般不会重复,所以下面就不用判断文件名是否重复了
$fileName = time().mt_rand(0,99999).$file['name'];
// 保存文件
if(move_uploaded_file($file['tmp_name'],$path1."/".$fileName)){
$info['isok'] = true;
$info['msg'] = "文件上传成功!";
}else{
$info['msg'] = "文件保存失败! 请查看目录是否有权限等问题!";
}
}
}
}
var_dump($info); //打印上传结果
为了方便 将上面的代码封装成一个方法方便以后调用
function uploadFile($path,$size=0,$fileType=[]){
// 文件上传错误码信息
$errorMsg = [
0=>"成功,没有错误",
1=>"上传的文件超过了 php.ini 中 upload_max_filesize选项限制的值。",
2=>"上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值。",
4=>"文件有部分没有上传",
5=>"文件没有被上传",
6=>"找不到临时文件夹",
7=>"文件写入失败"
];
// 接受传进来的文件数据
$file = $_FILES['tu1'];
// info用来存储信息
$info['isok'] = false;
// 判断文件上传是否出错
if($file['error'] > 0){
$info['msg'] = $errorMsg[$file['error']];
return $info; // return 之后便不会执行下面代码
}
// 判断是否限制大小
if($size != 0){
if(($file['size']/1024/1024) > $size){
$info['msg'] = "文件过大(文件大小限制为".$size."MB)";
return $info;
}
}
// 判断是否限制类型
if(!empty($fileType)){
if(!in_array($file['type'],$fileType)){
$info['msg'] = "文件类型错误";
return $info;
}
}
// 开始上传文件
$path1 = rtrim($path,"/");
// 创建目录
if(!is_dir($path1)){
mkdir($path1,"0777");
}
// 定义文件名
$fileName = time().mt_rand(0,99999).$file['name'];
// 保存文件
if(move_uploaded_file($file['tmp_name'],$path1."/".$fileName)){
$info['msg'] = "文件上传成功!";
$info['isok'] = true;
return $info;
}else{
$info['msg'] = "文件保存失败";
return $info;
}
}
$path = "111111";
var_dump(uploadFile($path));
接下来是多文件上传的实现
HTML部分: (要注意的是 type ="file" 这个input中要加入 multipe 才可以哦)
文件上传功能
多文件
upload2.php: (就不转换成方法了 , 有兴趣的各位自己试一下 , 其实也是多了个foreach)
"成功,没有错误",
1=>"上传的文件超过了 php.ini 中 upload_max_filesize选项限制的值。",
2=>"上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值。",
4=>"文件有部分没有上传",
5=>"文件没有被上传",
6=>"找不到临时文件夹",
7=>"文件写入失败"
];
// 定义文件类型 没有则去掉下面判断文件类型的一层if
$filesType = array("image/jpeg","image/jpg","image/png","image/gif","image/pjpeg","image/x-png");
// 规定文件上传大小 单位 (MB) , 为 0 则不限制大小
$size = 4;
// 接受传进来的文件数据
$file = $_FILES['tu1'];
// 定义文件上传路径
$path = "testUpload/";
// 获取目录名称
$path1 = rtrim($path,"/");
if(!is_dir($path1)){ // 判断上传目录是否存在 , 不存在则自动创建
mkdir($path1,"0777");
}
// 空数组 用来存储信息
$info = [];
$info['isok'] = false;
$files = $_FILES['tu1'];
// 随便循环一个 ----- name , tmp_name , size , error 都行 主要是用 key
foreach($files['name'] as $key => $v){
if($files['error'][$key] > 0){ // 判断文件上传是否出错
$info['msg'] = $errorMeg[$files['error'][$key]];
}else{
if(!in_array($files['type'][$key],$filesType)){ //判断文件格式是否正确
$info['msg'] = "文件格式不正确!";
}else{
if(($files['size'][$key]/1024/1024) > $size){ //判断文件大小是否符合
$info['msg'] = "文件限定大小为"."(".$size."MB)";
}else{
// 开始上传文件
// 定义文件名 时间戳+随机数+文件名 , 这样写文件名一般不会重复,所以下面就不用判断文件名是否重复了
$fileName = time().mt_rand(0,99999).$files['name'][$key];
// 保存文件
if(move_uploaded_file($files['tmp_name'][$key],$path1."/".$fileName)){
$info['isok'] = true;
$info['msg'] = "文件上传成功!";
}else{
$info['msg'] = "文件保存失败! 请查看目录是否有权限等问题!";
}
}
}
}
var_dump($info);
}
当然 多文件上传有几种方式 我这只是其中一种 , 原理都差不多
多多实践 收益多多