PHP脚本可以与HTML表单一起使用,以允许用户将文件上传到服务器。 最初文件上传到一个临时目录,然后通过PHP脚本重新写入到目标目录下。
phpinfo()
函数显示页面中的信息将用于文件上传的临时目录描述为upload_tmp_dir
,并且可以上传的最大文件大小为upload_max_filesize
。 这些参数可在PHP配置文件php.ini
中修改配置。
上传文件的过程有以下步骤 -
- 用户打开包含具有文本文件,浏览按钮和提交按钮的HTML表单的页面。
- 用户点击浏览按钮,从本地PC上选择要上传的文件。
- 所选文件的完整路径出现在文本文件中,然后用户单击提交按钮。
- 所选文件被发送到服务器上的临时目录中暂存。
- 在表单的
action
属性中指定为表单处理程序的PHP脚本会检查文件是否已到达,然后将文件复制到预期的目录中。 - PHP脚本确认了用户的成功。
像之前一样,当写入文件时,临时和最终位置都需要设置允许文件写入的权限。 如果其中任何一个设置为只读,则上传进程将失败。
上传的文件可以是文本文件或图像文件或任何文件。
创建一个上传表单
以下HTM代码创建一个上传表单。此表单将method
属性设置为:post
,enctype
属性设置为multipart/form-data
,注意: 这两个属性必须要这样设置,少一个都导致文件上传失败。参考下面一个简单的代码 -
<?php
ini_set('display_errors', 'Off');
$msg = '';
if(isset($_FILES['image'])){
$errors= array();
$file_name = $_FILES['image']['name'];
$file_size =$_FILES['image']['size'];
$file_tmp =$_FILES['image']['tmp_name'];
$file_type=$_FILES['image']['type'];
$file_ext=strtolower(end(explode('.',$_FILES['image']['name'])));
$expensions= array("jpeg","jpg","png");
if(in_array($file_ext,$expensions)=== false){
$errors[]="extension not allowed, please choose a JPEG or PNG file.";
}
if($file_size > 2097152){
$errors[]='File size must be excately 2 MB';
}
if(empty($errors)==true){
move_uploaded_file($file_tmp,"images/".$file_name);
$msg = "上传成功~!";
}else{
print_r($errors);
}
}
?>
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="utf-8" />
<title>PHP上传文件示例</title>
</head>
<body>
<center>
<?php echo $msg;?>
</center>
<form action="index.php" method="POST" enctype="multipart/form-data">
<input type="file" name="image" />
<input type="submit" value="提交"/>
</form>
</body>
</html>
它会产生以下结果 -
选择一个文件(任意类型),然后点击上传,应该在网站的images目录下看到上传的文件。
创建一个上传程序脚本
PHP中有一个名称为$_FILES
的全局变量。 这个变量是一个关联的二维数组,并保存所有与上传文件相关的信息。 因此,如果上传表单中分配给输入name
属性的值是文件,那么PHP将创建以下五个变量 -
$_FILES['file']['tmp_name']
- 上传的文件在Web服务器的临时目录中。$_FILES['file']['name']
- 上传文件的实际名称。$_FILES['file']['size']
- 上传文件的大小(以字节为单位)。$_FILES['file']['type']
- 上传文件的MIME类型。$_FILES['file']['error']
- 与此文件上传相关的错误代码。
示例
下面的例子应该允许上传图片,并显示上传的图片和此图片文件信息。
<?php
ini_set('display_errors', 'Off');
$upload_image = '';
if(isset($_FILES['image'])){
$errors= array();
$file_name = $_FILES['image']['name'];
$file_size = $_FILES['image']['size'];
$file_tmp = $_FILES['image']['tmp_name'];
$file_type = $_FILES['image']['type'];
$file_ext=strtolower(end(explode('.',$_FILES['image']['name'])));
$expensions= array("jpeg","jpg","png");
if(in_array($file_ext,$expensions)=== false){
$errors[]="只能上传 jpg, jpeg 和 png 图片文件";
}
if($file_size > 2097152) {
$errors[]='文件大小不可超过 2 MB';
}
if(empty($errors)==true) {
$upload_image = "images/".$file_name;
move_uploaded_file($file_tmp,$upload_image);
}else{
$upload_image = '';
print_r($errors);
}
}
?>
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="utf-8" />
<title>上传图片示例</title>
</header>
<body>
<?php
if($upload_image)
echo '<center><img src="'.$upload_image.'"/></center><hr/>';
?>
<form action = "index.php" method = "POST" enctype = "multipart/form-data">
<input type = "file" name = "image" />
<input type = "submit"/>
<ul>
<li>上传的文件名称: <?php echo $_FILES['image']['name']; ?>
<li>文件大小: <?php echo $_FILES['image']['size']; ?>
<li>文件类型: <?php echo $_FILES['image']['type'] ?>
</ul>
</form>
</body>
</html>
它会产生以下结果 -
选择一个图片文件,然后上传,将得到类似下面的结果 -