## HTTP POST 文件上传
PHP 使用超全局变量 $_FILES 接收 HTTP POST 方式提交的文件。
* `$_FILES['file']['name']` 客户端机器文件的原名称。
* `$_FILES['file']['type']` 文件的 MIME 类型
* `$_FILES['file']['size']` 已上传文件的大小,单位为字节。
* `$_FILES['file']['tmp_name']` 文件被上传后在服务端储存的临时文件名。
* `$_FILES['file']['error']` 和该文件上传相关的错误代码。
系统返回的错误码详解:
| 错误码 | 说明 |
| --- | --- |
| UPLOAD_ERR_OK(0)| 文件上传成功 |
| UPLOAD_ERR_INI_SIZE(1)| 上传的文件超过了 php.ini 中 upload_max_filesize 选项限制的值 |
| UPLOAD_ERR_FORM_SIZE(2)| 上传文件的大小超过了 表单中 MAX_FILE_SIZE 选项指定的值 |
| UPLOAD_ERR_PARTIAL(3)| 只有部分文件被上传 |
| UPLOAD_ERR_NO_FILE(4)| 文件没有被上传 |
| UPLOAD_ERR_NO_TMP_DIR(6)| 找不到临时文件夹 |
| UPLOAD_ERR_CANT_WRITE(7)| 文件写入失败 |
上传文件表单的基本结构:
```
<form action="file.php" method="POST" enctype="multipart/form-data">
<input type="hidden" name="MAX_FILE_SIZE" value="30000" />
<input type="file" name="file">
<input type="submit" value="submit">
</form>
```
注意事项:
* form 表单中的参数 method 必须为 POST
* enctype 须为 multipart/form-data
* MAX_FILE_SIZE 隐藏字段必须放在文件输入字段之前
上传示例:
```
<?php
$form = <<<EOT
<form action="test.php" method="POST" enctype="multipart/form-data">
<input type="hidden" name="MAX_FILE_SIZE" value="2000000" />
<p><input type="file" name="file"></p>
<p>只允许 gif,jpg,png 格式文件,大小不超过 2M</p>
<p><input type="submit" name="submit" value="submit"></p>
</form>
EOT;
if (isset($_POST['submit'])) {
if ($_FILES['file']['error'] > 0) {
exit('上传文件出错');
}
$MAX_FILE_SIZE = 2000000;
if ($_FILES['file']['size'] > $MAX_FILE_SIZE) {
exit('文件超出指定大小');
}
$allowExts = array('jpg', 'gif', 'png');
$parts = explode('.', $_FILES['file']['name']);
$ext = array_pop($parts);
if (!in_array($ext, $allowExts)) {
exit('文件后缀名不符');
}
$mimeTypes = array(
"image/jpg",
"image/jpeg",
"image/gif",
"image/png",
);
if (!in_array($_FILES['file']['type'], $mimeTypes)) {
exit('文件格式不正确,请检查');
}
$tmpName = $_FILES['file']['tmp_name'];
$targetName = '/home/koogua/tmp/' . uniqid() . '.' . $ext;
if (!is_uploaded_file($tmpName)) {
echo '不是上传文件';
}
if (move_uploaded_file($tmpName, $targetName)) {
echo '上传成功';
} else {
echo '上传失败';
}
} else {
echo $form;
}
?>
```
php.ini 上传配置项
| 配置项 | 功能说明 |
| --- | --- |
| file_uploads | on 为开启文件上传功能,off 为关闭 |
| post_max_size | 系统允许的 POST 传参的最大值 |
| upload_max_filesize | 系统允许的上传文件的最大值 |
| memory_limit | 内存使用限制 |
建议配置: file_size < upload_max_filesize < post_max_size < memory_limit
- 基本语法
- PHP标记
- 指令分隔符
- 从HTML中分离
- 注释
- 数据类型
- 布尔值
- 整数
- 浮点数
- 字符串
- 数组
- 对象
- 资源
- 空值
- 变量
- 基础
- 预定义变量
- 变量范围
- 可变变量
- 常量
- 常量语法
- 魔术常量
- 运算符
- 算术运算符
- 赋值运算符
- 位运算符
- 比较运算符
- 递增与递减运算符
- 逻辑运算符
- 字符串运算符
- 数组运算符
- 类型运算符
- 流程控制
- if条件结构
- switch条件结构
- while循环结构
- do-while循环结构
- for循环结构
- foreach循环结构
- 包含文件
- 函数
- 自定义函数
- 可变函数
- 匿名函数
- 递归函数
- 类与对象
- 基本概念
- 属性
- 方法
- 类常量
- 构造函数和析构函数
- 访问控制
- 继承
- 抽象类
- 接口
- Trait
- 重载
- 对象遍历
- 魔术方法
- Final关键字
- 命名空间
- 自动加载
- 错误处理
- 错误显示
- 错误日志
- 错误报告
- 自定义错误处理
- 异常处理
- 异常处理机制
- 扩展异常处理类
- 字符操作
- 数组操作
- 时间操作
- 表单操作
- GET提交
- POST提交
- 文件上传
- 会话控制
- COOKIE操作
- SESSION操作
- 文件操作
- 文件属性
- 读取文件
- 写入文件
- 文件管理
- 文件锁
- 目录处理
- 路径处理
- 网络操作
- HTTP协议
- Socket操作
- CURL操作
- PDO操作
- 介绍
- 连接管理
- 预处理语句
- 事务处理
- 错误处理
- 图像操作
- 正则表达式
- 标准推荐
- 包管理器
- 设计模式
- 常用算法
- 安全防御
- XSS防御
- CSRF防御