Blogger Information
Blog 70
fans 4
comment 5
visits 105124
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
PHP:文件上传上传限制,文件大小不超过5M,文件后缀设置,检查图片合法性,每一张图片处理散列名称,目标目录不存在,创建目录,设置错误日志接收系统错误
JiaJieChen
Original
1968 people have browsed it

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));
Correcting teacher:PHPzPHPz

Correction status:qualified

Teacher's comments:
Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post