@1kbfree
        
        2018-10-02T04:25:30.000000Z
        字数 2921
        阅读 1494
    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>
<?phpecho "<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><?phpif ($_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(白名单+判断数据流是否合法+判断文件大小)