有胆量你就来跟着路老师卷起来! -- 纯干货,技术知识分享
路老师给大家分享PHP语言的知识了,旨在想让大家入门PHP,并深入了解PHP语言。
编辑
上篇文章简单的了解了介绍文件的写操作及目录的操作,本文开始着手实现文件的上传功能及单文件上传案例实现。
1 文件上传
文件上传可以通过HTTP协议来实现。要是有文件上传功能,首先要在php.ini配置文件中对上传功能做一些配置,并且还要了解预定义变量$_FILES,并通过$_FILES的值对上传文件做出一些限制和判断,最后使用move_uploaded_file()函数实现上传的功能。
1.1 配置php.ini文件
要实现上传功能,首先要在php.ini文件中开启文件上传,并对其中的一些参数做出合理的设置。找到File Uploads项目:
编辑
- file_uploads:如果值是on,说明服务器支持文件上传,如果是off,则不支持。默认是on。
- upload_tmp_dir:上传文件临时目录。在文件被成功上传之前,文件首先存放到服务器端的临时目录中。如果想要指定位置,可在这里设置,一般使用默认目录即可。
- upload_max_filesize:服务器允许上产的文件的最大值,以MB为单位。默认为100MB。
- max_file_uploads:上传文件的数量最大限制默认20个。
- max_executon_time:PHP中一个指令所能执行的最大时间,单位为秒。
- memory_limit:PHP中一个指令所分配的内存空间,单位为MB。
1.2 预定义变量$_FILES
$_FILES变量存储的是上传文件的相关信息,这些信息对于上传功能有很大的作用。该变量是一个二维数组。保存信息如下:
元素名 | 说明 |
$_FILES[filename][name] | 存储了上传文件的文件名。如exam.txt,myDream.jpg |
$_FILES[filename][size] | 存储了文件大小。单位为字节 |
$_FILES[filename][tmp_name] | 文件上传时,首先在临时目录中被保存成一个临时文件。该变量为临时文件名 |
$_FILES[filename][type] | 上传文件的类型 |
$_FILES[filename][error] | 存储了上传文件的结果。如果返回0,则说明上传成功。 |
创建一个上传文件域,通过$_FILES变量输出上传文件的信息:
<html lang="zh-cn"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>文件上传</title> <link rel="stylesheet" href="http://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.css"> </head> <body class="col-sm-6 col-sm-offset-1 bg-info"> <h3 class="col-sm-offset-3">文件上传</h3> <form action="" method="post" enctype="multipart/form-data"> <div class="form-group"> <label for="exampleInputEmail1">邮箱</label> <input type="email" class="form-control" id="exampleInputEmail1" placeholder="请输入邮箱"> </div> <div class="form-group"> <label for="exampleInputPassword1">密码</label> <input type="password" class="form-control" id="exampleInputPassword1" placeholder="请输入密码"> </div> <div class="form-group"> <label for="exampleInputFile">头像</label> <input type="file" id="exampleInputFile" name="upfile"> </div> <button type="submit" class="btn btn-info">提交</button> </form> </body> </html>
编辑
注意:使用Form表单上传文件时,必须设置表单的enctype属性值为“multipart/form-data” ,即enctype=“multipart/form-data”,否则接收不到上传信息,$File为空。
目前PHP将文件信息数组一起返回一个对应的错误代码,即生成的文件数组中的error字段,也就是$_FILES[filename][error]参数值,具体如下:
错误代码 | 错误常量 | 描述 |
0 | UPLOAD_ERR_OK | 没有错误发生,文件上传成功。 |
1 | UPLOAD_ERR_INI_SIZE | 文件过大 |
2 | UPLOAD_ERR_FORM_SIZE | 文件大小超过了HTML表单中MAX_FILE_SIZE选项指定的值 |
3 | UPLOAD_ERR_PARTIAL | 文件只有部分被上传 |
4 | UPLOAD_ERR_NO_FILE | 没有文件被上传 |
6 | UPLOAD_ERR_NO_TMP_DIR | 找不到临时文件夹 |
7 | UPLOAD_ERR_CANT_WRITE | 文件写入失败 |
1.3 文件上传函数
PHP中使用move_uploaded_file()函数将上传文件存储到指定的位置,成功返回true,失败返回false。 语法如下:
bool move_uploaded_file( string $filename, string $destination)
- filename是上传文件的临时文件名
- destination是上传后保存的新的路径和名称。
案例-实现单个图片上传
<html lang="zh-cn"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>文件上传</title> <link rel="stylesheet" href="http://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.css"> </head> <body class="col-sm-6 col-sm-offset-1 bg-info"> <h3 class="col-sm-offset-3">文件上传</h3> <form action="doAction.php" method="post" enctype="multipart/form-data"> <div class="form-group"> <label for="exampleInputEmail1">邮箱</label> <input type="email" class="form-control" id="exampleInputEmail1" placeholder="请输入邮箱"> </div> <div class="form-group"> <label for="exampleInputPassword1">密码</label> <input type="password" class="form-control" id="exampleInputPassword1" placeholder="请输入密码"> </div> <div class="form-group"> <label for="exampleInputFile">头像</label> <input type="file" id="exampleInputFile" name="upfile"> <p class="text-danger">格式要求:jpeg/png/gif格式</p> </div> <button type="submit" class="btn btn-info">提交</button> </form> </body> </html>
doAction.php逻辑实现如下:
$email = $_POST['email']; $password = $_POST['password']; $fileInfo = $_FILES['upfile']; //检测文件上传是否成功 if(!is_null($fileInfo)){ if($fileInfo['error'] > 0){ switch($fileInfo['error']){ case 1: echo "上传的文件超过了php.ini中upload_max_filesize选项限制的值"; break; case 2: echo "上传的文件超过了HTML表单中MAX_FILE_SIZE选项指定的值"; break; case 3: echo "文件只有部分被上传"; break; case 4: echo "没有文件被上传"; break; case 6: echo "找不到临时文件夹"; break; case 7: echo "文件写入失败"; break; } exit; }else { //检测文件长度 if($fileInfo['size'] > 1000000){ echo "上传文件大于1M"; exit; } //检测拓展名 $allowExt = array('jpeg','jpg','png','gif'); $ext = strtolower(pathinfo($fileInfo['name'],PATHINFO_EXTENSION)); if(!in_array($ext,$allowExt)){ echo '不允许的拓展名'; exit; } //检测文件类型 $allowMime = array('image/jpeg','image/png','image/gif'); if(!in_array($fileInfo['type'],$allowMime)){ echo '上传文件类型错误'; exit; } //检测是否为真是图片 if(!@getimagesize($fileInfo['tmp_name'])){ echo '不是真实图片'; exit; } //保存图片 $uploadpath = 'upload'; if(!file_exists($uploadpath)){ $result = mkdir($uploadpath); } $uniName = md5(uniqid(microtime(true),true)); $destination = $uploadpath.'/'.$uniName.'.'.$ext; if(@move_uploaded_file($fileInfo['tmp_name'],$destination)){ echo "上传成功!"; }else{ echo '文件上传失败'; exit; } } }else{ echo '文件上传出错'; exit; }
编辑
编辑
下一篇 PHP 多文件上传