# 前端页面的表单
****
~~~
<form action="{:url('index/index')}" method="post" enctype="multipart/form-data">
<input type="hidden" name="MAX_FILE_SIZE" value="200">
<input type="file" name="up">
<input type="submit" value="提交">
</form>
~~~
注意:form的属性:enctype="multipart/form-data" 限制上传文件的大小name="MAX_FILE_SIZE" value="200";必须在 type="file"的前面
*****
# 配置文件
*****
修改PHP对应版本的php.ini配置文件可以定制上传机制
| 配置 | 说明 |
| --- | --- |
| file_uploads | 是否允许上传文件,On开启 Off禁止上传 |
| upload_tmp_dir | 文件上传过程中临时保存的目录,默认关闭状态 |
| upload_max_filesize | 允许上传的最大文件大小(单个文件),可以使用K、M、G单位如2M|
| post_max_size | PHP将接受的最大post数据大小,包括上传文件、表单数据。所以post_max_size要大于upload_max_filesize |
| max_file_uploads | 单个请求时,允许上传的最大文件数量|
# 超全局数组
*****
上传的文件保存在 $_FILES 超全局数组中,具体参数说明如下:
| 选项 | 说明 |
| --- | --- |
| tmp_name | 临时文件名 |
| name | 上传的原始文件名 |
| type | 文件MIME类型 |
| error | 错误编码 |
| size | 文件大小,单位字节 |
提交到后台后看云使用 $_FILES 获取到提交文件的数据如下:
~~~
["up"] => array(5) {
["name"] => string(13) "公众号.jpg"
["type"] => string(10) "image/jpeg"
["tmp_name"] => string(22) "C:\Windows\phpEB80.tmp"
["error"] => int(0)
["size"] => int(163380)
}
~~~
# 错误说明
*****
上传出错会在 $_FILES['error'] 选项中体现,具体错误如下:
| 错误 | 错误码 |说明|
| --- | --- | --- |
| UPLOAD_ERR_OK | 0 | 没有错误发送 |
| UPLOAD_ERR_INI_SIZE | 1 | 上传的文件超过了 php.ini中 upload_max_filesize选项限制的值 |
| UPLOAD_ERR_FORM_SIZE | 2 | 上传文件的大小超过了HTML表单中MAX_FILE_SIZE选项指定的值 |
| UPLOAD_ERR_PARTIAL | 3 | 文件只有部分被上传,上传中断 |
| UPLOAD_ERR_NO_FILE | 4 | 没有文件被上传 |
| UPLOAD_ERR_NO_TMP_DIR | 6 | 找不到临时文件夹 |
| UPLOAD_ERR_CANT_WRITE | 7 | 文件写入失败 |
# 上传安全
*****
上传通过 is_uolpaded_file 和 move_uploaded_file完成,函数会检测文件是否是合法的上传文件,以保证安全
~~~
if ($_FILES['up']['error'] > 0) {
die('上传失败,请检查文件类型或大小');
}
$uploadFile = 'uploads/' . time() . '.' .pathinfo($_FILES['up']['name'])['extension'];
if (is_uploaded_file($_FILES['up']['tmp_name'])) {
if (move_uploaded_file($_FILES['up']['tmp_name'],$uploadFile)) {
die('上传成功:'.$uploadFile);
}
}
die('上传错误');
~~~
# 处理类
*****
下面是支持单文件、多文件上传的处理类
## **前台代码**
~~~
<form action="controller.php" method="post" enctype="multipart/form-data">
<input type="file" name="up">
<input type="file" name="image[]">
<input type="file" name="image[]">
<button class="btn">提交上传</button>
</form>
~~~