最近在看php的教程,算是知道用php上传文件是怎么回事了。
首先是html代码:
<form action="t.php" method="post" enctype="multipart/form-data">
<input type="file" name="file">
<input type="submit">
</form>
form表单的enctype="multipart/form-data"属性是上传文件时必须的,它表示以二进制的数据格式来传输文件。
后台php代码如下:
<?php
header("Content-type:text/html;charset=utf-8");
if ($_FILES["file"]["error"] > 0) //如果有出错信息
{
echo "错误:" . $_FILES["file"]["error"] . "<br>";
}else{ //没有错误的话
echo "上传文件名: " . $_FILES["file"]["name"] . "<br>";
echo "文件类型: " . $_FILES["file"]["type"] . "<br>";
echo "文件大小: " . ($_FILES["file"]["size"] / 1024) . " kB<br>";
echo "文件临时存储的位置: " . $_FILES["file"]["tmp_name"];
//移动文件到指定位置
move_uploaded_file($_FILES["file"]["tmp_name"], DIR . "/".$_FILES["file"]["name"]);
}
?>
$_FILES存储各种与上传文件有关的信息。它的第一个的键名如"file"是文件上传框的name。第二个键名是上传文件的各项信息,如下:
$_FILES["file"]["name"] - 上传文件的名称 $_FILES["file"]["type"] - 上传文件的类型 $_FILES["file"]["size"] - 上传文件的大小,以字节计 $_FILES["file"]["tmp_name"] - 存储在服务器的文件的临时副本的名称 $_FILES["file"]["error"] - 由文件上传导致的错误代码
因为数据是以二进制形式上传的,所以当文件上传完毕之后,文件是存储在临时目录中的一个tmp文件,路径如"D:\wamp\tmp\phpFFB5.tmp"。所以在最后我们需要使用php内置的函数move_uploaded_file()将文件移动到指定位置,完成存储。
当然了,在生产环境中,上传文件不可能不进行验证。
在前台,我们可以使用JavaScript来获取要上传的文件的属性,如name、size、type、lastModified等。这些属性可以让我们在前台做出验证。这个可以参考《修改表单中file控件的外观》一文或者再去搜索。
在后台,php中$_FILES中也可以获取上传文件的各项属性,上面也已经讲过了。这里我偷懒直接贴个现成的代码:
<?php
// 允许上传的图片后缀
$allowedExts = array("gif", "jpeg", "jpg", "png");
$temp = explode(".", $_FILES["file"]["name"]);
$extension = end($temp); // 获取文件后缀名
if ((($_FILES["file"]["type"] == "image/gif")
|| ($_FILES["file"]["type"] == "image/jpeg")
|| ($_FILES["file"]["type"] == "image/jpg")
|| ($_FILES["file"]["type"] == "image/pjpeg")
|| ($_FILES["file"]["type"] == "image/x-png")
|| ($_FILES["file"]["type"] == "image/png"))
&& ($_FILES["file"]["size"] < 204800) // 小于 200 kb
&& in_array($extension, $allowedExts))
{
if ($_FILES["file"]["error"] > 0)
{
echo "错误:: " . $_FILES["file"]["error"] . "<br>";
}
else
{
echo "上传文件名: " . $_FILES["file"]["name"] . "<br>";
echo "文件类型: " . $_FILES["file"]["type"] . "<br>";
echo "文件大小: " . ($_FILES["file"]["size"] / 1024) . " kB<br>";
echo "文件临时存储的位置: " . $_FILES["file"]["tmp_name"];
}
}
else
{
echo "非法的文件格式";
}
?>
Google Chrome 52
Windows 7 x64 Edition
由于上传木马可以上多后缀的 所以一定要锁定于单后缀
比如 1.php.jpg
什么的