一、上传方式
在实现文件上传前,首先要了解文件上传的两种方式:POST和PUT。其中,POST是通过HTML表单将文件上传到服务器,而PUT是直接将文件上传到服务器的指定位置。
在PHP中,一般使用POST方式实现文件上传。在表单中,需要增加enctype属性为multipart/form-data,即:
<form action="upload.php" method="post" enctype="multipart/form-data">
//表单项
</form>
其中,enctype属性指定表单的编码类型。表示在表单中包含文件数据的二进制数据流。
二、上传处理
上传的文件可以通过$_FILES数组来获取。该数组包括以下信息:
- tmp_name:上传文件后被临时储存的位置
- name:上传文件的原始文件名
- type:上传文件的MIME类型
- size:上传文件的大小
- error:上传文件时出现的错误代码
下面以一个简单的上传图片的示例来说明:
//首先判断上传是否成功
if($_FILES['upload_file']['error'] > 0) {
echo '上传文件出错:' . $_FILES['upload_file']['error'];
}
//判断上传文件类型和大小是否符合规定
$allow_type = array('jpg', 'jpeg', 'png', 'gif');//允许上传的文件类型
$allow_size = 1048576;//允许上传的文件大小,单位为字节
$file_info = pathinfo($_FILES['upload_file']['name']);
$file_extension = $file_info['extension'];
if(!in_array($file_extension, $allow_type) || $_FILES['upload_file']['size'] > $allow_size) {
echo '上传文件类型或大小不符合规定';
}
//将上传的文件移动到指定目录
$save_path = 'upload/';
if(!file_exists($save_path)) {
mkdir($save_path, 0777, true);
}
$file_name = $_FILES['upload_file']['name'];
$file_path = $save_path . $file_name;
if(move_uploaded_file($_FILES['upload_file']['tmp_name'], $file_path)) {
echo '上传文件成功';
} else {
echo '上传文件失败';
}
这段代码中,首先判断上传是否成功。如果错误代码大于0,表示上传失败,并输出错误信息。
然后判断上传文件的类型和大小是否符合规定。这里允许上传的文件类型定义在$allow_type数组中,允许上传的文件大小为1MB。
上传成功后,将上传的文件移动到指定目录。首先要确保目录存在,如果不存在则创建该目录。然后将文件从临时位置移动到指定目录,并输出上传文件成功。
三、安全性处理
在文件上传过程中,需要注意文件的安全性问题。可能会出现以下几种情况:
- 上传恶意文件:黑客可能利用上传功能,上传病毒文件、木马、黑客工具等来攻击服务器或者绕过一些安全限制。
- 上传非法文件:可能会有人想要利用上传功能,上传一些违反法律的文件,如色情图片、侵犯他人隐私的文件等。
- 文件名恶意篡改:黑客可能会通过文件名来攻击服务器或者绕过一些安全限制,如提交文件名为../../index.php的文件,从而访问服务器上的index.php文件。
为了确保文件上传的安全性,需要进行如下处理:
- 文件类型检查:需要检查上传文件的类型是否在规定范围内,可以使用文件扩展名或MIME类型检查法。
- 文件大小限制:需要对上传文件的大小进行限制,防止大文件占用服务器过多资源。
- 上传位置限制:需要将上传的文件保存在指定目录下,对其他目录进行访问限制。
- 文件名处理:需要处理上传文件的文件名,避免文件名中包含特殊字符或恶意代码。
下面给出一个文件上传的安全处理的示例:
//检查文件类型是否正确
$allow_type = array('jpg', 'jpeg', 'png', 'gif');
$file_info = pathinfo($_FILES['upload_file']['name']);
$file_extension = $file_info['extension'];
if(!in_array($file_extension, $allow_type) || $_FILES['upload_file']['size'] > $allow_size) {
echo '上传文件类型或大小不符合规定';
}
//处理文件名,防止文件名中包含特殊字符或恶意代码
$file_name = $file_info['filename'] . time() . '.' . $file_extension;//时间戳加上文件名
//限制上传位置
$save_path = 'upload/';
if(!file_exists($save_path)) {
mkdir($save_path, 0777, true);
}
$file_path = $save_path . $file_name;
if(move_uploaded_file($_FILES['upload_file']['tmp_name'], $file_path)) {
echo '上传文件成功';
} else {
echo '上传文件失败';
}
这段代码中,首先对上传文件类型进行检查,只允许上传jpg、jpeg、png、gif四种类型的文件。然后对文件名进行处理,加上时间戳,避免文件名中包含特殊字符或恶意代码。最后,将上传文件保存在upload目录下,防止上传到其他目录。
四、完整代码示例
综合上述内容,给出一个完整的文件上传示例代码:
<form action="upload.php" method="post" enctype="multipart/form-data">
<input type="file" name="upload_file">
<input type="submit" value="上传文件">
</form>
<?php
$allow_size = 1048576;
if($_FILES['upload_file']['error'] > 0) {
echo '上传文件出错:' . $_FILES['upload_file']['error'];
}
$allow_type = array('jpg', 'jpeg', 'png', 'gif');
$file_info = pathinfo($_FILES['upload_file']['name']);
$file_extension = $file_info['extension'];
if(!in_array($file_extension, $allow_type) || $_FILES['upload_file']['size'] > $allow_size) {
echo '上传文件类型或大小不符合规定';
}
$file_name = $file_info['filename'] . time() . '.' . $file_extension;
$save_path = 'upload/';
if(!file_exists($save_path)) {
mkdir($save_path, 0777, true);
}
$file_path = $save_path . $file_name;
if(move_uploaded_file($_FILES['upload_file']['tmp_name'], $file_path)) {
echo '上传文件成功';
} else {
echo '上传文件失败';
}
?>