博客列表 >单文件上传,多文件批量上传,异常处理操作-php-31课7.31

单文件上传,多文件批量上传,异常处理操作-php-31课7.31

希望
希望原创
2020年08月02日 19:18:22915浏览

1.单文件上传,自定义异常类来处理常见错误

  • 对错误编码的判断
  • 判断文件类型是否正确
  • 判断上传方式是否正确
  1. | 序号 | 常量 | | 描述
  2. | 1 | `UPLOAD_ERR_OK` | `0` | 没有错误发生,文件上传成功 |
  3. | 2 | `UPLOAD_ERR_INI_SIZE` | `1` | 文件超过`php.ini``upload_max_filesize` |
  4. | 3 | `UPLOAD_ERR_FORM_SIZE` | `2` | 文件大小超过表单中`MAX_FILE_SIZE`指定的值 |
  5. | 4 | `UPLOAD_ERR_PARTIAL` | `3` | 文件只有部分被上传 |
  6. | 5 | `UPLOAD_ERR_NO_FILE` | `4` | 没有文件被上传 |
  7. | 6 | `UPLOAD_ERR_NO_TMP_DIR` | `6` | 找不到临时文件夹 |
  8. | 7 | `UPLOAD_ERR_CANT_WRITE` | `7` | 文件写入失败 |
  • 以下举了一些上传错误的例子

  1. <?php
  2. error_reporting(E_ALL);
  3. // $_FILES: 文件上传变量,超全局的变量数组, 保存着所有与文件上传的相关信息
  4. printf('<pre>%s</pre>', print_r($_FILES, true));
  5. // 自定义文件上传的异常处理类
  6. class UploadException extends Exception
  7. {
  8. public function __toString()
  9. {
  10. return <<< UPLOAD
  11. <table>
  12. <tr>
  13. <td>编号</td>
  14. <td>信息</td>
  15. <td>文件</td>
  16. <td>行号</td>
  17. </tr>
  18. <tr>
  19. <td>$this->code</td>
  20. <td>$this->message</td>
  21. <td>$this->file</td>
  22. <td>$this->line</td>
  23. </tr>
  24. </table>
  25. <style>
  26. table {border-collapse: collapse;border:1px solid black;text-align: center;}
  27. td {border:1px solid black;padding: 5px;}
  28. tr:first-of-type {background-color:#eee;}
  29. tr:last-of-type td {color: red;}
  30. </style>
  31. UPLOAD;
  32. }
  33. }
  34. try {
  35. // 对错误编码的判断
  36. $errorCode = $_FILES['my_pic']['error'] ?? null;
  37. // 使用系统常量进行判断
  38. if ($errorCode > UPLOAD_ERR_OK) {
  39. switch ($errorCode) {
  40. case UPLOAD_ERR_INI_SIZE:
  41. throw new UploadException('上传的文件超过了 php.ini 中 upload_max_filesize 选项限制的值',1);
  42. break;
  43. case UPLOAD_ERR_FORM_SIZE:
  44. throw new UploadException('上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值', 2);
  45. break;
  46. case UPLOAD_ERR_PARTIAL:
  47. throw new UploadException('文件只有部分被上传', 3);
  48. break;
  49. case UPLOAD_ERR_NO_FILE:
  50. throw new UploadException('没有文件被上传', 4);
  51. break;
  52. case UPLOAD_ERR_NO_TMP_DIR:
  53. throw new UploadException('找不到临时文件夹', 5);
  54. break;
  55. case UPLOAD_ERR_CANT_WRITE:
  56. throw new UploadException('文件写入失败', 6);
  57. break;
  58. default:
  59. // 测试时建议关掉default: 避免误报影响
  60. throw new UploadException('未知类型错误', 7);
  61. }
  62. }
  63. // 判断文件类型是否正确
  64. $fileType = $_FILES['my_pic']['type'] ?? null;
  65. $type = strstr($fileType, '/', true); // "image"
  66. // var_dump($fileType);
  67. // 不为null时,取反
  68. if (!is_null($fileType)) {
  69. if ($type !== 'image') throw new UploadException('文件类型错误', 8);
  70. }
  71. // 判断上传方式是否正确
  72. // 临时文件名
  73. $tmplFileName = $_FILES['my_pic']['tmp_name'] ?? null;
  74. // 首先临时文件是存在的,并且必须是通过POST上传的
  75. if ($tmplFileName && is_uploaded_file($tmplFileName)) throw new UploadException('上传类型错误', 9);
  76. } catch (UploadException $e) {
  77. echo $e;
  78. }
  79. ?>
  80. <!DOCTYPE html>
  81. <html lang="en">
  82. <head>
  83. <meta charset="UTF-8">
  84. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  85. <title>文件上传的异常处理</title>
  86. </head>
  87. <body>
  88. <form action="" method="POST" enctype="multipart/form-data">
  89. <fieldset>
  90. <legend>单文件上传</legend>
  91. <!-- 隐藏域设置上传文件大小,必须写到input:file之前 -->
  92. <!-- 前端拦截 -->
  93. <input type="hidden" name="MAX_FILE_SIZE" value="38000">
  94. <input type="file" name="my_pic" id="">
  95. <button>上传</button>
  96. </fieldset>
  97. </form>
  98. </body>
  99. </html>

2.多文件批量上传及异常处理操作

  1. <?php
  2. error_reporting(E_ALL);
  3. printf('<pre>%s</pre>', print_r($_FILES, true));
  4. // // 自定义文件上传的异常处理类
  5. class UploadException extends Exception
  6. {
  7. public function __toString()
  8. {
  9. return <<< UPLOAD
  10. <table>
  11. <tr>
  12. <td>编号</td>
  13. <td>信息</td>
  14. <td>文件</td>
  15. <td>行号</td>
  16. </tr>
  17. <tr>
  18. <td>$this->code</td>
  19. <td>$this->message</td>
  20. <td>$this->file</td>
  21. <td>$this->line</td>
  22. </tr>
  23. </table>
  24. <style>
  25. table {border-collapse: collapse;border:1px solid black;text-align: center;}
  26. td {border:1px solid black;padding: 5px;}
  27. tr:first-of-type {background-color:#eee;}
  28. tr:last-of-type td {color: red;}
  29. </style>
  30. UPLOAD;
  31. }
  32. }
  33. try {
  34. // 对错误编码的判断
  35. $errorCode = $_FILES['my_pic']['error'] ?? null;
  36. // 使用系统常量进行判断
  37. if ($errorCode > UPLOAD_ERR_OK) {
  38. switch ($errorCode) {
  39. case UPLOAD_ERR_INI_SIZE:
  40. throw new UploadException('上传的文件超过了 php.ini 中 upload_max_filesize 选项限制的值',1);
  41. break;
  42. case UPLOAD_ERR_FORM_SIZE:
  43. throw new UploadException('上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值', 2);
  44. break;
  45. case UPLOAD_ERR_PARTIAL:
  46. throw new UploadException('文件只有部分被上传', 3);
  47. break;
  48. case UPLOAD_ERR_NO_FILE:
  49. throw new UploadException('没有文件被上传', 4);
  50. break;
  51. case UPLOAD_ERR_NO_TMP_DIR:
  52. throw new UploadException('找不到临时文件夹', 5);
  53. break;
  54. case UPLOAD_ERR_CANT_WRITE:
  55. throw new UploadException('文件写入失败', 6);
  56. break;
  57. default:
  58. // 测试时建议关掉default: 避免误报影响
  59. throw new UploadException('未知类型错误', 7);
  60. }
  61. }
  62. // 判断文件类型是否正确
  63. $fileType = $_FILES['my_pic']['type'] ?? null;
  64. $type = strstr($fileType, '/', true); // "image"
  65. if (!is_null($fileType)) {
  66. if ($type !== 'image') throw new UploadException('文件类型错误', 8);
  67. }
  68. // 判断上传方式是否正确
  69. // 临时文件名tmplFileName
  70. $tmplFileName = $_FILES['my_pic']['tmp_name'] ?? null;
  71. // 1. 首先临时文件是存在的,并且必须是通过POST上传的
  72. if ($tmplFileName && is_uploaded_file($tmplFileName)) {
  73. // 2. 将文件从临时目录移动到目标目录中: uploads/
  74. // move_uploaded_file(临时文件, 目标文件名)
  75. // 原始文件名originalFileName
  76. $originalFileName = $_FILES['my_pic']['name'] ?? null;
  77. echo strstr($originalFileName, '.');
  78. // 目标文件名destFileName,如果上传重复了,就得把文件名加密处理,生成随时字符串
  79. $destFileName = 'uploads/' . md5(time(). mt_rand(1,1000)) .strstr($originalFileName, '.');
  80. // 将临时文件上传到目标文件
  81. if (move_uploaded_file($tmplFileName, $destFileName)) {
  82. echo '<p>'. $_FILES['my_pic']['name'].': 上传成功</p>';
  83. // 预览图片
  84. echo "<img src='{$destFileName}' width='200'>";
  85. }
  86. }
  87. } catch (UploadException $e) {
  88. echo $e;
  89. }
  90. // 多文件上传
  91. foreach ($_FILES as $file) {
  92. // print_r($file);
  93. // 判断 $file['error'] 是否为0,如果为0表示上传成功
  94. if ($file['error'] === 0) {
  95. $destFileName = 'uploads/' . md5(time(). mt_rand(1,1000)) .strstr($file['name'], '.');
  96. if (move_uploaded_file($file['tmp_name'], $destFileName)) {
  97. echo '<p>'. $file['name'].': 上传成功</p>';
  98. // 预览图片
  99. echo "<img src='{$destFileName}' width='200'>";
  100. }
  101. }
  102. }
  103. ?>
  104. <!DOCTYPE html>
  105. <html lang="en">
  106. <head>
  107. <meta charset="UTF-8">
  108. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  109. <title>多文件上传</title>
  110. </head>
  111. <body>
  112. <form action="" method="POST" enctype="multipart/form-data">
  113. <fieldset>
  114. <legend>批量上传文件</legend>
  115. <!-- 隐藏域设置上传文件大小,必须写到input:file之前 -->
  116. <!-- <input type="hidden" name="MAX_FILE_SIZE" value="38000"> -->
  117. <input type="file" name="my_pic1" id="">
  118. <input type="file" name="my_pic2" id="">
  119. <input type="file" name="my_pic3" id="">
  120. <button>上传</button>
  121. </fieldset>
  122. </form>
  123. </body>
  124. </html>

-总结:

  • 单文件上传,有7种错误要进行判断
  • 文件必须是通过POST上传的
  • 多文件上传,批量上传,文件上传类中同样要做8种错误判断
  • 上传重复图片时,就得把文件名加密处理,生成随时字符串,uploads目录里就会自动生成不同的串码
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议