[关闭]
@1kbfree 2018-10-02T12:25:30.000000Z 字数 2921 阅读 1149

PHP文件上传

PHP


文件上传常用在头像上传,视频上传等,是各大网站不可少的功能。

文件上传是HTML配合PHP完成的。

首先,先看看前段的代码:

  1. <!--
  2. 文件名:test.php
  3. -->
  4. <form action="./test.php" method="post" enctype="multipart/form-data"> <!-- POST请求提交到本页面 -->
  5. <input type="file" name="myfile"> <!-- 文件上传 -->
  6. <input type="submit" value="提交"><!-- 提交 -->
  7. </form>

接收处代码,也就是PHP代码:

  1. <?php
  2. echo "<pre>";
  3. print_r($_FILES);
  4. ?>

效果:

image_1ccid9ph82it1vs61e6q15j61dle9.png-82.3kB

$_FILES

我们之前那个只是输出了_FILES。

整个代码:

  1. <!doctype html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport"
  6. content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
  7. <meta http-equiv="X-UA-Compatible" content="ie=edge">
  8. <title>Document</title>
  9. </head>
  10. <body>
  11. <form action="./test.php" method="post" enctype="multipart/form-data">
  12. <input type="file" name="file">
  13. <input type="submit" value="提交">
  14. </form>
  15. <?php
  16. if ($_FILES["file"]["error"] > 0)
  17. {
  18. echo "错误:" . $_FILES["file"]["error"] . "<br>";
  19. }
  20. else{
  21. echo "上传文件名: " . $_FILES["file"]["name"] . "<br>";
  22. echo "文件类型: " . $_FILES["file"]["type"] . "<br>";
  23. echo "文件大小: " . ($_FILES["file"]["size"] / 1024) . " kB<br>";
  24. echo "文件临时存储的位置: " . $_FILES["file"]["tmp_name"];
  25. }
  26. ?>
  27. </body>
  28. </html>

上传后的结果:
image_1ccidni01brdoq0ckc6rl7ksm.png-10.6kB

文件上传的错误码:

  1. UPLOAD_ERR_OK
    其值为 0,没有错误发生,文件上传成功。

  2. UPLOAD_ERR_INI_SIZE
    其值为 1,上传的文件超过了 php.ini 中 upload_max_filesize选项限制的值。

  3. UPLOAD_ERR_FORM_SIZE
    其值为 2,上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值。

  4. UPLOAD_ERR_PARTIAL
    其值为 3,文件只有部分被上传。

  5. UPLOAD_ERR_NO_FILE
    其值为 4,没有文件被上传。

  6. UPLOAD_ERR_NO_TMP_DIR
    其值为 6,找不到临时文件夹。PHP 4.3.10 和 PHP 5.0.3 引进。

  7. UPLOAD_ERR_CANT_WRITE
    其值为 7,文件写入失败。PHP 5.1.0 引进。

临时存储处:

当我们上传的文件后,明明显示了tmp地址,但是我们去查看的时候文件却不存在,这是为什么呢,然后笔者就死查必应啊之类的搜索引擎,发现 PHP文件上传时临时存储的文件在代码执行结束后会自动被删除。不相信我们看看:

image_1ccierrg31tcgc2em8j11bka2p13.png-17.2kB
临时存储的位置在这个文件夹: C:\Users\iamfree\AppData\Local\Temp\,我们现在访问一下

image_1ccif8rho1l771s233uahn6npc1t.png-60.3kB
什么狗屁(呸,临时文件)都没有

那么我们如何才可以看到临时的文件呢,有一个好办法,就是给php代码加上sleep(10)就是给代码休眠十秒,我们来试试:

image_1ccifidi31abljmiu6q1pe81kss3g.png-98kB

然后我们上传一个文件:
image_1ccifk37q1c061khsd53qf14p93t.png-69kB
然后我们就可以看到这里多出来一个文件,说明我们的方法管用了。

还有一种方法:

用PHP的copy()函数,不多介绍,直接看代码:
image_1ccifoqb0ieqnaf1hi2173krmg4a.png-55.5kB

我们就可以在此代码的目录下看到这个copy的文件:
image_1ccifq5291fe51r4l1o581vtjl964n.png-90.3kB

我们对比一下copy的文件和原文件是否一样:
image_1ccifshjpbs5jtth5m19ki14d354.png-86.5kB
一毛一样

还有一种方法:

最常用的文件上传的函数move_uploaded_file()
image_1ccigbrq51nge1f9m155p1ccb1eoi6v.png-70.8kB
接着,我们进C:\Users\iamfree\Desktop\test目录看一下文件是否存在
image_1ccige8c6196n1pfd3ct1lodmf7s.png-33.2kB
成功上传~


设置上传限制:

  1. <?php
  2. // 允许上传的图片后缀
  3. $allowedExts = array("gif", "jpeg", "jpg", "png");
  4. $temp = explode(".", $_FILES["file"]["name"]);
  5. $extension = end($temp); // 获取文件后缀名
  6. if ((($_FILES["file"]["type"] == "image/gif")
  7. || ($_FILES["file"]["type"] == "image/jpeg")
  8. || ($_FILES["file"]["type"] == "image/jpg")
  9. || ($_FILES["file"]["type"] == "image/pjpeg")
  10. || ($_FILES["file"]["type"] == "image/x-png")
  11. || ($_FILES["file"]["type"] == "image/png"))
  12. && ($_FILES["file"]["size"] < 204800) // 小于 200 kb
  13. && in_array($extension, $allowedExts))
  14. {
  15. if ($_FILES["file"]["error"] > 0)
  16. {
  17. echo "错误:: " . $_FILES["file"]["error"] . "<br>";
  18. }
  19. else
  20. {
  21. echo "上传文件名: " . $_FILES["file"]["name"] . "<br>";
  22. echo "文件类型: " . $_FILES["file"]["type"] . "<br>";
  23. echo "文件大小: " . ($_FILES["file"]["size"] / 1024) . " kB<br>";
  24. echo "文件临时存储的位置: " . $_FILES["file"]["tmp_name"];
  25. }
  26. }
  27. else
  28. {
  29. echo "非法的文件格式";
  30. }
  31. ?>

这样子可以简单限制一些攻击者上传web木马来getshell(白名单+判断数据流是否合法+判断文件大小)

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注