PHP(12)文件上传
- 一、文件上传原理
- 二、表单写法
- 三、预定义变量 $_FILES
- 四、移动临时文件
- 五、多文件上传
- 1. 同名表单
- 2. 不同名表单
- 六、多文件处理
- 1. 同名文件
- 2. 不同名文件
- 七、封装文件上传函数
一、文件上传原理
文件从客户机上传至服务器指定目录。
步骤:
- 增加文件上传的表单。
- 客户机上传文件至服务器。
- 服务器操作系统将文件保存在临时目录。
- 服务器脚本判断文件有效性,将有效文件从临时目录移动到指定目录。
二、表单写法
- method 必须是 POST。
- enctype 必须是
multipart/form-data
<body>
<form action="./index.php" method="post" enctype="multipart/form-data">
<input type="file" name="image"/>
<input type="submit" name="btn" value="上传文件"/>
</form>
</body>
三、预定义变量 $_FILES
<?php
header("Content-type:text/html;charset=utf-8");
echo '<pre>';
var_dump($_POST);
var_dump($_FILES);
- name => 文件在客户机的名字。
- type => MIME(多功能互联网邮件扩展)类型。
- tmp_name => 文件上传到服务器的临时路径。
- error => 文件上传的错误代号。
- size => 文件大小。
四、移动临时文件
- 判断是否为上传的文件:is_uploaded_file()
- 移动临时文件:move_uploaded_file()
<?php
header("Content-type:text/html;charset=utf-8");
echo '<pre>';
//取得文件信息
$file = $_FILES['image'];
// 移动临时文化
if (is_uploaded_file($file['tmp_name'])) {
// 是上传文件
if (move_uploaded_file($file['tmp_name'], 'uploads/' . $file['name'])) {
echo "文件保存成功";
}else{
echo '文件保存失败';
}
} else {
// 不是上传文件
echo '文件上传失败';
}
五、多文件上传
1. 同名表单
- 针对一个内容但是不同文件说明
- 批量上传后,将表单名字形成一个数组,同时将对应的五个要素都形成对应数量的数组,每个文件上传对应数组元素的下标都是一样的。
2. 不同名表单
- 针对不同内容,所以表单名字不一样。
- 每个文件都会形成一个属于自己独立的5个元素的数组。
六、多文件处理
1. 同名文件
<?php
echo '<pre>';
//遍历处理
$images = $_FILES['image'];
for ($i = 0; $i < sizeof($images['name']); $i++) {
if (is_uploaded_file($images['tmp_name'][$i])) {
move_uploaded_file($images['tmp_name'][$i], 'uploads/' . $images['name'][$i]);
echo $images['name'][$i] . "保存成功" . "<br>";
}
}
2. 不同名文件
<?php
echo '<pre>';
//遍历处理
foreach ($_FILES as $FILE) {
if (is_uploaded_file($FILE['tmp_name'])) {
move_uploaded_file($FILE['tmp_name'], 'uploads/' . $FILE['name']);
echo $FILE['name'] . "保存成功" . "<br>";
}
}
七、封装文件上传函数
- 判断文件是否有效
- 判断文件存储路径是否有效
- 判断文件上传过程是否出错
- 判断MIME类型
- 判断文件格式
- 判断文件大小
- 判断是否是上传文件
- 文件重命名并移动到指定目录
<?php
header("Content-type:text/html;charset=utf-8");
function upload_single($file, $allow_type, $path, &$error, $allow_format = array(), $max_size = 2000000) {
# 判断文件是否有效
if (!is_array($file) || !isset($file['error'])) {
$error = '不是一个有效的上传文件!';
return false;
}
# 判断文件存储路径是否有效
if (!is_dir($path)) {
$error = '文件存储路径不存在';
return false;
}
# 判断文件上传过程是否出错
switch ($file['error']) {
case 1:
case 2:
$error = '文件超出服务器允许大小';
return false;
case 3:
$error = '文件上传过程中出现问题,只上传了一部分!';
return false;
case 4:
$error = '用户没有选中要上传的文件!';
return false;
case 6:
case 7:
$error = '文件保存失败!';
return false;
}
# 判断MIME类型
if (!in_array($file['type'], $allow_type)) {
$error = '当前文件类型不允许上传';
return false;
}
# 判断文件格式
$ext = ltrim(strrchr($file['name'], '.'), '.');
if (!empty($allow_format) && !in_array($ext, $allow_format)) {
$error = '当前文件格式不允许上传!';
return false;
}
# 判断文件大小
if ($file['size'] > $max_size) {
$error = '当前上传的文件超出大小,大小为' . $max_size / 1024 . 'KB';
return false;
}
# 判断是否是上传文件
if (!is_uploaded_file($file['tmp_name'])) {
$error = '错误:不是上传文件!';
return false;
}
# 文件重命名
$fullName = strstr($file['type'], '/', true) . '_' . date("Ymd") . "_";
for ($i = 0; $i < 4; $i++) {
$fullName .= chr(mt_rand(65, 90));
}
$fullName .= '.' . $ext;
# 移动到指定目录
if (move_uploaded_file($file['tmp_name'], $path . '/' . $fullName)) {
return $fullName;
} else {
$error = '文件上传失败';
return false;
}
}
$file = $_FILES['image'];
$path = 'uploads';
$allow_type = array('image/jpg', 'image/jpeg', 'image/gif', 'image/png');
$allow_format = array('jpg', 'jpeg', 'gif', 'png');
$max_size = 8000000;
if ($filename = upload_single($file, $allow_type, $path, $error, $allow_format, $max_size)) {
echo $filename;
} else {
echo $error;
}