博客列表 >经典再现:PHP文件上传函数,从封装到引用,积木式Web应用的雏形~

经典再现:PHP文件上传函数,从封装到引用,积木式Web应用的雏形~

张福根一修品牌运营
张福根一修品牌运营原创
2020年12月10日 21:16:33702浏览

作业:文件上传,封装一个单文件上传的函数
文件上传表单

文件上传表单demo1.php

  1. <?php
  2. // 一. 上传表单enctype属性应设置说明:
  3. // enctype="multipart/form-data"
  4. // multipart/form-data是指表单数据有多部分构成,既有文本数据,又有文件等二进制数据的意思。
  5. // 需要注意的是:默认情况下,enctype的值是application/x-www-form-urlencoded,不能用于文件上传,
  6. // 只有使用了multipart/form-data,才能完整的传递文件数据。
  7. ?>
  8. <!DOCTYPE html>
  9. <html lang="en">
  10. <head>
  11. <meta charset="UTF-8">
  12. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  13. <title>单文件上传</title>
  14. </head>
  15. <body>
  16. <form action="demo2.php" method="post" enctype="multipart/form-data">
  17. <fieldset>
  18. <legend>单文件上传</legend>
  19. <input type="file" name="my_file">
  20. <button>上传</button>
  21. </fieldset>
  22. </form>
  23. </body>
  24. </html>

封装函数文件libtext.php

  1. <?php
  2. // 上传文件的描述信息,全部保存在系统全局变量`$_FILES`中,包括:
  3. // name文件在客户端的原始文件名
  4. // type文件的 MIME 类型, 由浏览器提供
  5. // tmp_name 文件被上传到服务器上之后,在临时目录中临时文件名
  6. // error 文件上传相关的错误代码
  7. // size 已上传文件的大小
  8. function upload(array $fileInfo,$uploadPath="uploads",$flag = true,$allowExt=['jpg','jpeg','png','wbmp','gif'],$maxSize=2097152){
  9. // 防止文件重名产生覆盖
  10. $fileRealPath = $path.md5($prefix.time()).'.'.$ext;
  11. // 判断文件上传是否出错
  12. if( $fileInfo['error'] != 0)
  13. {
  14. return false;
  15. }
  16. //检验图片是否真实
  17. // getimagesize() 函数用于获取图像大小及相关信息,成功返回一个数组,失败则返回 FALSE 并产生一条 E_WARNING 级的错误信息
  18. if($flag)
  19. {
  20. if(!getimagesize($fileInfo['tmp_name']))
  21. {
  22. die('不是真实图片,get out~');
  23. }
  24. }
  25. // 判断文件大小是否合规
  26. if($fileInfo['size'] > $maxSize)
  27. {
  28. die('文件大小超过限制的最大值~');
  29. }
  30. // 拿到文件后缀:explode() 函数把字符串打散为数组。array_pop() 函数删除数组中的最后一个元素。in_array() 函数搜索数组中是否存在指定的值
  31. $ext = array_pop(explode('.',$fileInfo['name'])) ;
  32. // 判定上传的文件类型是否合规
  33. if(!in_array($ext,$allowExt))
  34. {
  35. die('非法的文件类型');
  36. }
  37. // is_uploaded_file — 判断文件是否是通过 HTTP POST 上传的
  38. if(!is_uploaded_file($fileInfo['tmp_name']))
  39. {
  40. die('上传方式错误:请使用http post方式上传');
  41. }
  42. // 原始图片的前缀,防止文件重名产生覆盖 ,文件真正储存的位置
  43. $prefix = array_shift(explode('.',$fileInfo['name'])) ;
  44. // 判断目录是否存在,如果不存在创建,并且设置权限
  45. if(!file_exists($uploadPath))
  46. {
  47. //允许全局访问
  48. mkdir($uploadPath,0777,true);
  49. chmod($uploadPath,0777);
  50. }
  51. // 定义文件移动后在名称
  52. $fileRealPath = $uploadPath.'/'.md5($prefix.time()).'.'.$ext;
  53. // 判断文件是否上传(移动)成功
  54. // move_uploaded_file — 将上传的文件移动到新位置
  55. if (!move_uploaded_file($fileInfo['tmp_name'],$fileRealPath))
  56. {
  57. die('文件上传失败');
  58. }
  59. //返回文件路径
  60. return $fileRealPath;
  61. }

后端调用函数处理请求demo2.php

  1. <?php
  2. // 二. 作为后端程序员,对用户上传的文件(比如:图片)限制项:
  3. // 1、文件是否真实
  4. // 2、文件大小超过限制的最大值
  5. // 3、非法的文件类型
  6. // 4、上传方式:需要使用http post方式上传
  7. // 5、文件是否上传成功
  8. // 三. 案例:封装一个适合(单)文件上传的函数:
  9. // 1、require_once 语句和 require 语句完全相同,唯一区别是 PHP 会检查该文件是否已经被包含过,如果是则不会再次包含。
  10. // 2、常量__DIR__,指向当前执行的PHP脚本所在的目录。
  11. // 3、DIRECTORY_SEPARATOR是一个显示系统分隔符的命令,DIRECTORY_SEPARATOR是PHP的内部常量,不需要任何定义与包含即可直接使用
  12. require_once __DIR__ . DIRECTORY_SEPARATOR . 'lib'. DIRECTORY_SEPARATOR . 'libtext.php';
  13. $fileInfo = $_FILES['my_file'];
  14. $newName = upload($fileInfo,'storages/uploads');
  15. echo $newName;
  16. // 输出结果:storages/uploads/e14d94cc10e2af8eaedc5be515078ea0.jpg

程序运行结果:

程序运行结果

声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议