@1kbfree
2018-10-02T12:25:30.000000Z
字数 2921
阅读 1149
PHP
文件上传常用在头像上传,视频上传等,是各大网站不可少的功能。
文件上传是HTML配合PHP完成的。
<!--
文件名:test.php
-->
<form action="./test.php" method="post" enctype="multipart/form-data"> <!-- POST请求提交到本页面 -->
<input type="file" name="myfile"> <!-- 文件上传 -->
<input type="submit" value="提交"><!-- 提交 -->
</form>
<?php
echo "<pre>";
print_r($_FILES);
?>
我们之前那个只是输出了_FILES。
整个代码:
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<form action="./test.php" method="post" enctype="multipart/form-data">
<input type="file" name="file">
<input type="submit" value="提交">
</form>
<?php
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"];
}
?>
</body>
</html>
上传后的结果:
$_FILES["file"]["name"]
上传文件的名称$_FILES["file"]["type"]
上传文件的类型$_FILES["file"]["size"]
上传文件的大小,以字节计$_FILES["file"]["tmp_name"]
存储在服务器的文件的临时副本的名称$_FILES["file"]["error"]
由文件上传导致的错误代码,错误码有几种,下面讲讲UPLOAD_ERR_OK
其值为 0,没有错误发生,文件上传成功。
UPLOAD_ERR_INI_SIZE
其值为 1,上传的文件超过了 php.ini 中 upload_max_filesize选项限制的值。
UPLOAD_ERR_FORM_SIZE
其值为 2,上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值。
UPLOAD_ERR_PARTIAL
其值为 3,文件只有部分被上传。
UPLOAD_ERR_NO_FILE
其值为 4,没有文件被上传。
UPLOAD_ERR_NO_TMP_DIR
其值为 6,找不到临时文件夹。PHP 4.3.10 和 PHP 5.0.3 引进。
UPLOAD_ERR_CANT_WRITE
其值为 7,文件写入失败。PHP 5.1.0 引进。
当我们上传的文件后,明明显示了tmp地址,但是我们去查看的时候文件却不存在,这是为什么呢,然后笔者就死查必应啊之类的搜索引擎,发现 PHP文件上传时临时存储的文件在代码执行结束后会自动被删除
。不相信我们看看:
临时存储的位置在这个文件夹: C:\Users\iamfree\AppData\Local\Temp\
,我们现在访问一下
什么狗屁(呸,临时文件)都没有
那么我们如何才可以看到临时的文件呢,有一个好办法,就是给php代码加上sleep(10)
就是给代码休眠十秒,我们来试试:
然后我们上传一个文件:
然后我们就可以看到这里多出来一个文件,说明我们的方法管用了。
用PHP的copy()
函数,不多介绍,直接看代码:
我们就可以在此代码的目录下看到这个copy的文件:
我们对比一下copy的文件和原文件是否一样:
一毛一样
最常用的文件上传的函数move_uploaded_file()
:
接着,我们进C:\Users\iamfree\Desktop\test
目录看一下文件是否存在
成功上传~
<?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 "非法的文件格式";
}
?>
这样子可以简单限制一些攻击者上传web木马来getshell(白名单+判断数据流是否合法+判断文件大小)