1、文件上传原理

ü 上传文件,就是将文件从浏览器端传到服务器端;
ü 上传文件,必须使用

标记来向服务器端发数据;
ü 上传文件,标记的method属性值必须是POST;
ü 上传文件,标记的enctype属性值必须是multipart/form-data;
ü 上传文件,必须使用标记实现。
image.png

2、超全局变量数组 $_FILES

Ø $_POST数组中保存的是普通表单元素数据;
Ø $_FILES数组中保存的是上传文件的信息。
image.png

3、上传文件错误代码

image.png
提示:0、1、4比较重要。

4、查看上传的临时文件位置

ü 上传文件的默认临时目录,如果没有指定php.ini配置项upload_tmp_dir的值,则使用操作系统临时目录(c:\windows\temp)。通过phpinfo()函数查看。
ü 为什么在 c:\windows\temp 中看不到上专文件呢?因为临时文件是短暂存在的,也就是在脚本执行完毕后,就消失了。
image.png

5、将上传文件移动到新位置

ü 描述:本函数检查并确保由 filename 指定的文件是合法的上传文件(即通过 PHP 的 HTTP POST 上传机制所上传的)。如果文件合法,则将其移动为由 destination 指定的文件。最好在临时文件没有消失前移动。
ü 语法:bool move_uploaded_file ( string $filename , string $destination )
ü 参数:$filename,指定上传的临时文件名;$destination,指定新的文件名路径;
ü 注意:如果文件已经存在,则会覆盖操作。
image.png

6、上传文件的相关配置(php.ini)

ü upload_max_filesize配置:上传单个文件的大小限制,默认为2MB。
ü post_max_size配置:规定上传多个文件的总大小,默认为8MB。
ü max_file_uploads配置:规定最多上传的文件个数,默认为20个。
image.png
image.png

7、获取文件路径信息 pathinfo()

ü 描述:返回文件路径的信息 ;
ü 语法:mixed pathinfo ( string $path [, int $options = PATHINFO_DIRNAME | PATHINFO_BASENAME | PATHINFO_EXTENSION | PATHINFO_FILENAME ] )
ü 参数:
þ $path,要解析的路径。
þ $options,如果省略,返回全部单元;
þ PATHINFO_DIRNAME,目录名称;
þ PATHINFO_BASENAME,文件名称;
þ PATHINFO_EXTENSION,扩展名;
þ PATH_FILENAME,文件名。

8、检查数组中是否存在某个值 in_array()

ü 描述:检查数组中是否存在某个值
ü 语法:bool in_array ( mixed $needle , array $arr )
ü 参数:$needle检索的值,$arr原数组。

9、生成唯一ID uniqid()

ü 描述:生成一个唯一ID
ü 语法:string uniqid ([ string $prefix = “” [, bool $more_entropy = false ]] )
ü 参数:
þ $prefix前缀字符串,如果省略,返回字符串长度为13;
þ $more_entropy后缀字符串,如果为true,返回字符串长度为23。
image.png

实操

单个文件上传

image.png

html

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8">
  5. <title>文件上传原理</title>
  6. </head>
  7. <body>
  8. <form name="form1" method="post" enctype="multipart/form-data" action="upload.php">
  9. 上传图片:<input type="file" name="uploadFile">
  10. <input type="submit" value="提交">
  11. <input type="hidden" name="token" value="upload">
  12. </form>
  13. </body>
  14. </html>

php

  1. <?php
  2. //判断表单是否合法提交
  3. if(isset($_POST['token']) && $_POST['token']=='upload')
  4. {
  5. print_r("<pre/>");
  6. print_r($_FILES);
  7. /*
  8. (1)判断上传文件有没有错误发生
  9. (2)判断上传文件是否超过2MB大小
  10. (3)判断上传文件是不是图片
  11. (4)移动临时文件到虚拟目录中:取出文件扩展名、文件名唯一性
  12. */
  13. //(1)判断上传文件有没有错误发生
  14. if($_FILES['uploadFile']['error']!=0)
  15. {
  16. echo "<h2>上传文件发生了错误!</h2>";
  17. die();
  18. }
  19. //(2)判断上传文件大小是否超过2MB
  20. if($_FILES['uploadFile']['size']>2*1024*1024)
  21. {
  22. echo "<h2>文件大小超出php.ini中的限制!</h2>";
  23. die();
  24. }
  25. //(3)判断上传文件是不是图片
  26. $arr = array('image/jpeg','image/png','image/gif');
  27. $type = $_FILES['uploadFile']['type'];
  28. if(!in_array($type,$arr))
  29. {
  30. echo "<h2>必须上传图像!</h2>";
  31. die();
  32. }
  33. //(4)移动临时文件,到./upload目录中
  34. $ext = pathinfo($_FILES['uploadFile']['name'],PATHINFO_EXTENSION); //jpg
  35. $tmp_name = $_FILES['uploadFile']['tmp_name'];
  36. $dst_name = "./upload/".uniqid().".".$ext;
  37. move_uploaded_file($tmp_name,$dst_name);
  38. echo "<h2>文件上传成功</h2>";
  39. die();
  40. }else
  41. {
  42. echo "非法操作";
  43. }

多个文件上传

html

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8">
  5. <title>文件上传原理</title>
  6. </head>
  7. <body>
  8. <form name="form1" method="post" enctype="multipart/form-data" action="upload.php">
  9. 上传图片1:<input type="file" name="uploadFile[]"><br>
  10. 上传图片2:<input type="file" name="uploadFile[]"><br>
  11. 上传图片3:<input type="file" name="uploadFile[]"><br>
  12. <input type="submit" value="提交">
  13. <input type="hidden" name="token" value="upload">
  14. </form>
  15. </body>
  16. </html>

php

  1. <?php
  2. //判断表单是否合法提交
  3. if(isset($_POST['token']) && $_POST['token']=='upload')
  4. {
  5. print_r("<pre/>");
  6. print_r($_FILES);
  7. //将三维数组,转成二维数组
  8. $arrs = $_FILES['uploadFile'];
  9. //循环判断,只需要移动有文件上传的
  10. foreach($arrs['name'] as $key=>$name)
  11. {
  12. //如果文件不则,则移动文件
  13. if($name != "")
  14. {
  15. $ext = pathinfo($name,PATHINFO_EXTENSION);
  16. print_r($ext);echo "<br>";
  17. $tmp_name = $arrs['tmp_name'][$key];
  18. print_r($tmp_name);echo "<br>";
  19. $dst_name = "./upload/".uniqid().".".$ext;
  20. print_r($dst_name);echo "<hr>";
  21. move_uploaded_file($tmp_name,$dst_name);
  22. }
  23. }
  24. }else
  25. {
  26. echo "非法操作";
  27. }

image.png