【实例描述】在网站中,文件上传是一个必备的组成部分。很多网站都要用到文件的上传,如用户上传自定义的头像、需求方上传需要翻译的原文等。本实例实现了单个图片文件上传和预览效果。
【实现过程】(1)创建脚本文件index.php。在页面上添加表单结构和文件域,以供用户选择图片路径,表单的核心代码如下。
<form action="upload.php?submit=on" method="post" enctype="multipart/form-data"
name="myForm">
请选择上传的图片
<input type="file" name="filename" id="filename" onChange="ok()">
<center>
<font color="red">注意:请上传120*45像素的GIF或者jpg格式的logo图片
</font>
</center>
<input type="hidden" name="MAX_FILE_SIZE" value="30000" />
<input type="submit" name="Submit" value="上传" class='input'>
</form>
(2)创建脚本文件upload.php。添加PHP脚本文件如下。
<?php
header('Content-type:text/html;charset=utf-8'); // 定义页面编码格式
if(!empty($_GET['submit'])){
// 表单非空验证
$path="./upload/"; // 文件上传路径
if(!file_exists($path)){ // 检查是否有该文件路径
mkdir("$path", 0700); // 创建文件路径,并给予最高权限
}
$tp = array("image/gif","image/pjpeg","image/png"); // 允许上传的文件格式
if(!in_array($_FILES["filename"]["type"],$tp)){ // 检查文件上传类型
echo "格式不对";
exit();
}
if($_FILES["filename"]["size"]>(2048*1000)){ // 检查文件上传大小
echo "不能上传大于2m的文件";
exit();
}
if($_FILES["filename"]["name"]){ // 生成文件上传名称
$file1=explode('.',$_FILES["filename"]["name"]);
$kz = $file1[(count($file1)-1)];
$time = time(); // 获取当前日期时间戳
$name = $time.".".$kz; // 生成上传文件名称
$file2 = $path.$name;
// 生成上传文件路径
$flag=1;
}
if($flag){ // 把文件移动到指定的目录
$result=move_uploaded_file($_FILES["filename"]["tmp_name"],$file2);
}
if($result){ // 对图片进行预览
echo "<script>alert(\"上传成功!\");</script>";
echo "<center>图片名称:".$name."</center><br>";
echo "<center>logo预览:<br></center><center><img src='".$file2."'>
</center>";
}
} else{ // 文件上传失败提示
echo "<script>alert('文件为空!');location='index.php';</script>";
}
?>
【代码解析】本实例中,使用了$_FILES预定义变量和文件上传函数实现图片上传的效果。实现步骤如下。
(1)设置表单的enctype属性,使用POST提交和隐藏域。若进行文件上传,就需要给文件域控件所在的表单头添加enctype属性。enctype属性的值通常如下所示。
- ❑ application/x-www-form-urlencoded:默认值,此类型主要用来处理少量文本数据的传递。在向服务器发送其他数据类型时,效率较低。
- ❑ multipart/form-data:上传二进制数据。本例中使用类型值进行文件的上传。
- ❑ text/plain:此方式主要用于发送大量的文本数据。
实现文件上传效果必须使用POST提交模式,本实例设置隐藏域如下。
<input type="hidden" name="MAX_FILE_SIZE" value="30000" />
隐藏域中name的值默认为MAX_FILE_SIZE,通过定义value里面的值(单位字节)来限定表单文件上传的最大值。
(2)使用 $_FILES
预定义变量获取文件上传信息。当用户以POST
模式提交表单信息时,文件会被保存在临时目录中,文件的信息会被保存在$_FILES
预定义变量中,用户可根据$_FILES
变量中的信息进行文件上传操作。$_FILES
预定义变量数组参数说明如表1所示。
表1 预定义变量$_FILES
数组参数说明
(3)使用move_uploaded_file()
函数把临时图片文件移动到指定目录下。文件上传后,文件会被临时保存在服务器的临时目录下,可以使用此函数把文件从临时目录下移动到用户自定义的位置,语法如下。
bool move_uploaded_file ( string filename, string destination)
此函数和文件拷贝函数不同的是,其除了对文件进行复制和移动外,还可以检查并确保由filename
指定的文件是合法上传文件(即通过HTTP POST
机制所上传的文件)。如果文件合法,则将其移动为由destination
指定的文件。如果filename
不是合法的上传文件,不会出现任何操作,move_uploaded_file()
将返回假。如果filename
是合法的上传文件,但出于某些原因无法移动,也不会出现任何操作,move_uploaded_file()
同样将返回假,此外还会发出一条警告。这种检查对安全性显得格外重要。所以,通常都会使用此函数进行文件移动。
if($flag){ // 把文件移动到指定的目录
$result=move_uploaded_file($_FILES["filename"]["tmp_name"],$file2);
}
(4)以上3个步骤为文件上传的核心,本实例还提供了文件类型检测和文件大小检测。类型检测有助于构建更加安全的程序运行环境,防止用户或程序的恶意提交。文件类型检测如下。
if(!in_array($_FILES["filename"]["type"],$tp)){ // 检查文件上传类型
……此处省略部分代码
文件大小检测如下。
if($_FILES["filename"]["size"]>(2048*1000)){ // 检查文件上传大小
echo "不能上传大于2MB的文件";
exit();
}