PHP文件上传
文件上传
基本概念:从本地客户端上传文件到远程服务端。
上传流程简介:
1、服务器写好文件上传页面
2、客户端请求,服务端返回文件上传页面,并进行文件上传
3、服务器收到上传文件,首先将文件存储到tmp
临时存储目录下,然后通过php
脚本判断是否满足上传文件标准
4、满足标准,将临时目录文件移动到服务器指定目录;不满足条件,将临时目录文件删除。
表单写法
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>文件上传</title>
</head>
<body>
<!-- form表单文件上传时,必须使用 enctype 属性为 multipart/form-data -->
<form action="file_upload.php" method="POST" enctype="multipart/form-data">
<input type="file" name="image">
<p></p>
<input type="submit" name="上传文件">
</form>
</body>
</html>
PHP处理上传文件
查看$_FILES
获取文件格式
<?php
$POST = $_POST;
$FILE = $_FILES;
var_dump($POST);
var_dump($FILE);
?>
可以看出
1、数组的键名由
form
表单中name
的值控制
2、name
:代表文件名
3、type
:MIMIE类型(多功能互联网邮件扩展),代表文件类型,用于在计算机中在客户端识别文件类型,通过文件头Content-type
获取
4、tmp_name
:文件临时存储目录
5、error
:文件上传的代号,类似于浏览器访问404、301
,用来告知文件上传过程中出现的问题
6、size
:代表文件大小(字节b:1kb = 1024b)
移动临时文件到目标文件
<?php
$file = $_FILES['image'];
// 判断文件是否上传
if (is_uploaded_file($file['tmp_name'])){
// 上传文件
if (move_uploaded_file($file['tmp_name'],'upload\\'.$file['name'])){
echo "文件上传成功";
}else{
echo "文件已上传,但是移动时出现错误";
}
}else{
echo '上传文件失败';
}
?>
多文件上传
多文件提交分为两种方式:同名上传
和不同名上传
同名上传
name的值一样,需要加入[]
好形成一个数组
例如:files_1.html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>多文件上传_1</title>
</head>
<body>
<form action="files.php" method="POST" enctype="multipart/form-data">
<input type="file" name="test[]">
<br/>
<input type="file" name="test[]">
<br/>
<input type="file" name="test[]">
<br/>
<input type="submit" name="submit" value="多文件提交_1">
</form>
</body>
</html>
files.php
<?php
header("Content-Type: text/html","charset:utf-8");
echo "<pre>";
print_r($_FILES);
?>
运行结果
可以看到,三个文件上传到了一个数组,其中问价对应的属性name,type,tmp_name,error,size
,对应的值从0下标开始
每个文件每个属性的下标都是一样的。
不同名上传
name
属性的值都不一样
例如:files_2.html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>多文件上传_2</title>
</head>
<body>
<form action="files.php" method="POST" enctype="multipart/form-data">
<input type="file" name="file_1">
<br/>
<input type="file" name="file_2">
<br/>
<input type="file" name="file_3">
<br/>
<input type="submit" name="submit" value="多文件提交_2">s
</form>
</body>
</html>
其中name
属性的值分别为file_1、file_2、file_3
,提交查看结构
每个文件对应其属性,这个就比较简洁好看一点。
多文件上传示例
files.php
<?php
header("Content-Type: text/html","charset:utf-8");
echo "<pre>";
$n = 1;
foreach($_FILES as $file){
if(is_uploaded_file($file['tmp_name'])){
move_uploaded_file($file['tmp_name'], 'upload\\'.$file['name']);
echo "文件上传成功".$n++;
echo "<br />";
}else{
echo "文件上传失败";
}
}
?>
foreach循环数组中的键名,然后将文件依次进行上传。
同名文件上传示例
这是属实看不懂,有精力再研究。
进阶文件上传
在写代码时,要保证代码的通用性,就是换到另个平台依然可以使用。
这里就需要定义一些变量,来实现代码的灵活行,例如以下:
$file
需要上传文件的信息
$allow_type
允许上传文件的类型
$path
文件上传的位置
$error
上传错误的原因
$allow_format
允许上传的文件格式
$max_size
允许上传文件的大小