博客列表 >PHP:文件上传上传限制,文件大小不超过5M,文件后缀设置,检查图片合法性,每一张图片处理散列名称,目标目录不存在,创建目录,设置错误日志接收系统错误

PHP:文件上传上传限制,文件大小不超过5M,文件后缀设置,检查图片合法性,每一张图片处理散列名称,目标目录不存在,创建目录,设置错误日志接收系统错误

JiaJieChen
JiaJieChen原创
2021年05月24日 20:50:491955浏览

PHP:封装文件上传函数

1. php 关于文件上传的配置

文件上传项目项在php.ini中设置,常用的配置项有:

序号 配置项 默认值 描述
1 file_uploads On 使 PHP 支持文件上传
2 upload_tmp_dir /tmp 指示应该临时把上传的文件存储在什么位置
3 max_file_uploads 20 单次请求时允许上传的最大文件数量
4 max_execution_time 30 设置脚本被解析器终止之前PHP最长执行时间(秒) ,防止服务器资源被耗尽
5 max_input_time 60 设置 PHP 通过 POST/GET/PUT 解析接收数据的时长(秒)
6 memory_limit 128M 系统分配给当前脚本执行可用的最大内存容量
7 post_max_size 8M 允许的 POST 数据的总大小
8 upload_max_filesize 32M 允许的尽可能最大的文件上传

2. $_FILE

  • 上传文件的描述信息,全部保存在系统全局变量$_FILES
  • $_FILES以二维数组形式保存: $_FILES['form_file_name']['key']
  • 'form_file_name': 对应着表单中<input type="file" name="my_pic">name属性值
  • 'key': 共有 5 个键名, 描述如下:
序号 键名 描述
1 name 文件在客户端的原始文件名(即存在用户电脑上的文件名)
2 type 文件的 MIME 类型, 由浏览器提供, PHP 并不检查它
3 tmp_name 文件被上传到服务器上之后,在临时目录中临时文件名
4 error 和该文件上传相关的错误代码
5 size 已上传文件的大小(单位为字节)
  • 文件上传错误信息描述
序号 常量 描述
1 UPLOAD_ERR_OK 0 没有错误发生,文件上传成功
2 UPLOAD_ERR_INI_SIZE 1 文件超过php.iniupload_max_filesize
3 UPLOAD_ERR_FORM_SIZE 2 文件大小超过表单中MAX_FILE_SIZE指定的值
4 UPLOAD_ERR_PARTIAL 3 文件只有部分被上传
5 UPLOAD_ERR_NO_FILE 4 没有文件被上传
6 UPLOAD_ERR_NO_TMP_DIR 6 找不到临时文件夹
7 UPLOAD_ERR_CANT_WRITE 7 文件写入失败

3.封装单文件上传

  1. 文件大小不超过5M

  2. 后缀只能是[‘jpg’,’jpeg’,’png’,’wbmp’,’gif’]

  3. 检查图片合法性

  4. 为每一张图片处理散列名称

  5. 目标目录不存在,创建目录 6.设置错误日志接收系统错误,而不是将错误显示到页面上

①普通单文件上传,没有封装成为函数

html代码块
  • form文件上传新属性: enctype="multipart/form-data"
  1. <?php
  2. /**
  3. * 文件上传 :客户端上传文件到服务器, 首先存在临时文件夹下,
  4. * 做一些严格的验证(大小, 后缀,合法文件,),通过以后,移动文件到指定的文件夹
  5. */
  6. ?>
  7. <!DOCTYPE html>
  8. <html lang="en">
  9. <head>
  10. <meta charset="UTF-8">
  11. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  12. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  13. <title>文件上传</title>
  14. </head>
  15. <body>
  16. <form action="index.php" method="post" enctype="multipart/form-data">
  17. <fieldset>
  18. <legend>单文件上传</legend>
  19. <label for="myFile">
  20. <input type="file" name="myFile" id="myFile">
  21. </label>
  22. <button>上传</button>
  23. </fieldset>
  24. </form>
  25. </body>
  26. </html>
PHP代码块
  1. <?php
  2. //开启错误日志
  3. ini_set('error_log','./error.log');
  4. //打印接收的文件格式
  5. printf("<pre>%s</pre>",print_r($_FILES,true));
  6. //接受的文件属性进行变量赋值
  7. $FilesName = $_FILES['myFile']['name'];
  8. $FilesType = $_FILES['myFile']['type'];
  9. $FilesTmp_name = $_FILES['myFile']['tmp_name'];
  10. $FilesError = $_FILES['myFile']['error'];
  11. $FilesSize = $_FILES['myFile']['size'];
  12. //判断用户上传的文件类型/检测是否合法文件
  13. if ($FilesError == 0) {
  14. //设置上传文件的类型
  15. $allowExt = ['jpg','jpeg','png','wbmp','gif'];
  16. //拆分文件名称的前后缀
  17. $arr = explode('.',$FilesName);
  18. //获取文件名称的前缀
  19. $prefix = array_shift($arr);
  20. //获取文件名称的后缀
  21. $ext = array_pop($arr);
  22. //in_array — 检查数组中是否存在某个值 则返回 true,否则返回 false。
  23. if (!in_array($ext,$allowExt)) {
  24. //检查文件类型
  25. die('非法的文件类型');
  26. }
  27. //限制文件上传大小
  28. $MaxSize = 2097152;
  29. if ($MaxSize < $FilesSize) {
  30. die('文件大小超过限制的最大值');
  31. }
  32. //检测上传的文件是否合法
  33. //getimagesize — 取得图像大小
  34. if (!getimagesize($FilesTmp_name)) {
  35. die('不是真实图片');
  36. }
  37. //检测文件上传是否用 http post 上传
  38. //is_uploaded_file — 判断文件是否是通过 HTTP POST 上传的
  39. if (!is_uploaded_file($FilesTmp_name)) {
  40. die('上传方式错误:请用HTTP post方式上传');
  41. }
  42. //如果文件正确则移动此文件
  43. $action = 'uploads/';
  44. //file_exists指定的文件或目录存在则返回 true,否则返回 false。
  45. if (!file_exists($action)) {
  46. //mkdir — 新建目录
  47. mkdir($action,0777,true);
  48. //chmod — 改变文件模式
  49. chmod($action,0777);
  50. }
  51. //move_uploaded_file — 将上传的文件移动到新位置
  52. move_uploaded_file($FilesTmp_name,$action.$FilesName);
  53. echo "文件上传成功";
  54. }else {
  55. //switch 循环出 error 错误的信息
  56. switch ($FilesError) {
  57. case 1:
  58. echo '文件超过`php.ini`中`upload_max_filesize`值<br>';
  59. break;
  60. case 2:
  61. echo '文件大小超过表单中`MAX_FILE_SIZE`指定的值<br>';
  62. break;
  63. case 3:
  64. echo '文件只有部分被上传<br>';
  65. break;
  66. case 4:
  67. echo '没有文件被上传<br>';
  68. break;
  69. case 6:
  70. echo '找不到临时文件夹<br>';
  71. break;
  72. case 7:
  73. echo '文件写入失败<br>';
  74. break;
  75. default:
  76. echo "文件写入失败";
  77. break;
  78. }
  79. }

②单文件上传,封装成为函数

公共函数代码块
  1. <?php
  2. //封装文件上传函数
  3. /*
  4. * 第一个值:用户上传的文件/后端接收的文件
  5. * 第二个值:设置默认上传文件的路径
  6. * 第三个值:判断是否检测文件合法
  7. * 第四个值:设置默认文件格式
  8. * 第五个值:设置默认允许用户上传文件大小
  9. */
  10. function UploadedFile(array $fileInfo,$uploadPath = "./uploads",$flag = true,array $allowExt = ['jpg','JPG','jpeg','png','wbmp','gif'],$MaxSize = 5242880)
  11. {
  12. //判断用户上传的文件/后端接收的文件错误信息是否=0
  13. if ($fileInfo['error'] != 0)
  14. {
  15. switch ($error) {
  16. case 1:
  17. $res['mess'] = '文件超过`php.ini`中`upload_max_filesize`值<br>';
  18. break;
  19. case 2:
  20. $res['mess'] = '文件大小超过表单中`MAX_FILE_SIZE`指定的值<br>';
  21. break;
  22. case 3:
  23. $res['mess'] = '文件只有部分被上传<br>';
  24. break;
  25. case 4:
  26. $res['mess'] = '没有文件被上传<br>';
  27. break;
  28. case 6:
  29. $res['mess'] = '找不到临时文件夹<br>';
  30. break;
  31. case 7:
  32. $res['mess'] = '文件写入失败<br>';
  33. break;
  34. default:
  35. $res['mess'] = "文件写入失败";
  36. break;
  37. }
  38. return $res['mess'];
  39. }
  40. //后端设置文件的类型
  41. //设置上传文件的类型
  42. //拆分文件名称的前后缀
  43. $arr = explode('.',$fileInfo['name']);
  44. //获取文件名称的前缀
  45. $prefix = array_shift($arr);
  46. //获取文件名称的后缀
  47. $ext = array_pop($arr);
  48. //in_array — 检查数组中是否存在某个值 则返回 true,否则返回 false。
  49. if (!in_array($ext,$allowExt))
  50. {
  51. //检查文件类型
  52. $res['mess'] =('非法的文件类型');
  53. }
  54. //限制文件上传大小
  55. if ($MaxSize < $fileInfo['size'])
  56. {
  57. $res['mess'] =('文件大小超过限制的最大值');
  58. }
  59. //检测上传的文件是否合法
  60. //getimagesize — 取得图像大小
  61. if ($flag)
  62. {
  63. if (!getimagesize($fileInfo['tmp_name'])) {
  64. $res['mess'] =('不是真实图片');
  65. }
  66. }
  67. //检测文件上传是否用 http post 上传
  68. //is_uploaded_file — 判断文件是否是通过 HTTP POST 上传的
  69. if (!is_uploaded_file($fileInfo['tmp_name'])) {
  70. $res['mess'] =('上传方式错误:请用HTTP post方式上传');
  71. }
  72. if (!empty($res)) {
  73. return $res;
  74. }
  75. //-------------------------------------------
  76. //如果文件正确则移动此文件
  77. //file_exists指定的文件或目录存在则返回 true,否则返回 false。
  78. if (!file_exists($uploadPath)) {
  79. //mkdir — 新建目录
  80. mkdir($uploadPath,0777,true);
  81. //chmod — 改变文件模式
  82. chmod($uploadPath,0777);
  83. }
  84. //文件名称md5+时间戳 加密
  85. $fileRealPath = $uploadPath.'/'.md5($prefix.time()).'.'.$ext;
  86. //move_uploaded_file — 将上传的文件移动到新位置
  87. if (!move_uploaded_file($fileInfo['tmp_name'],$fileRealPath))
  88. {
  89. $res['mess'] = '文件移动失败';
  90. }else
  91. {
  92. $res['mess'] = $fileInfo['name'].'文件上传成功';
  93. $res['fileRealPath'] = $fileRealPath;
  94. return $res;
  95. }
  96. }
INDEX3调用函数代码块
  1. <?php
  2. require 'common.php';
  3. ini_set('error_log','./error.log');
  4. //文件大小超出 post_max_size的值 $_FILES,$_POST全部为空
  5. $post_max_size = ini_get('post_max_size');
  6. $fileInfo = $_FILES['myFile'];
  7. $res = isset($fileInfo) ? UploadedFile($fileInfo) : NULL;
  8. echo "<p>{$res['mess']}</p>"."<br>";
  9. echo "<p>{$res['fileRealpath']}</p>"."<br>";

4.封装多文件上传

  • 多文件上传: <input type="file" name="myFile[]" id="myFile" multiple> input 需要加上multiple

多文件上传需要遍历上传的文件,因为多个文件是三维数组

多文件上传,三维数组遍历,接下来把这个方法封装到函数中

文件上传成功

多文件上传封装函数代码块
  1. //多文件上传方法
  2. function upload()
  3. {
  4. $file = [];
  5. $i = 0;
  6. foreach ($_FILES as $key => $file) {
  7. //因为是三维数组 还得遍历一次
  8. foreach ($file['name'] as $key => $value) {
  9. $file[$i]['name'] = $file['name'][$key];
  10. $file[$i]['type'] = $file['type'][$key];
  11. $file[$i]['tmp_name'] = $file['tmp_name'][$key];
  12. $file[$i]['error'] = $file['error'][$key];
  13. $file[$i]['size'] = $file['size'][$key];
  14. $i++;
  15. }
  16. }
  17. return $file;
  18. }
多文件上传客户端代码块
  1. <?php
  2. require 'common.php';
  3. ini_set('error_log','./error.log');
  4. //文件大小超出 post_max_size的值 $_FILES,$_POST全部为空
  5. $post_max_size = ini_get('post_max_size');
  6. //多文件上传需要遍历上传的文件,因为多个文件是三维数组
  7. printf('<pre>%s</pre>',print_r($_FILES,true));
  8. //多文件上传三维数组遍历成二维数组,二维数组遍历成一维数组
  9. $file = upload();
  10. foreach ($file as $key => $fileInfo) {
  11. $res = UploadedFile($fileInfo);
  12. echo '<p style="color:green">'.$res['mess'].'</p>';
  13. //获取文件真实路径 转成js格式上传到数据库
  14. $uploadFiles[] = $res['fileRealPath'];
  15. }
  16. // var_dump(json_encode($uploadFiles));
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议