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 允许上传文件的大小

posted @ 2022-06-14 10:56  Junglezt  阅读(2224)  评论(0编辑  收藏  举报