博客列表 >PHP基础:单文件上传、多文件上传、批量上传

PHP基础:单文件上传、多文件上传、批量上传

暴宇
暴宇原创
2020年06月02日 15:33:471720浏览

PHP基础:单文件上传、多文件上传、批量上传

1.单文件上传

  1. // 自定义上传异常类
  2. class UploadException extends Exception
  3. {
  4. // 在异常子类中,可以访问并重写Exception中的四个属性,通过__toString()格式化异常输出信息
  5. public function __toString()
  6. {
  7. return <<< UPLOAD
  8. <style>
  9. table {border-collapse: collapse;border:1px solid black;text-align: center;}
  10. td {border:1px solid black;padding: 5px;}
  11. tr:first-of-type {background-color:#eee;}
  12. tr:last-of-type td {color: coral;}
  13. </style>
  14. <table>
  15. <tr><td>代码</td><td>信息</td><td>文件</td><td>行号</td></tr>
  16. <tr><td>$this->code</td><td>$this->message</td><td>$this->file</td><td>$this->line</td></tr>
  17. </table>
  18. UPLOAD;
  19. }
  20. }
  21. ///////////////////////////////////////////////////////////////////////
  22. try {
  23. // 上传出错的代码
  24. $errorCode = $_FILES['my_pic']['error'];
  25. if ($errorCode > UPLOAD_ERR_OK) {
  26. switch ($errorCode) {
  27. case UPLOAD_ERR_INI_SIZE:
  28. throw new UploadException('上传的文件超过了 php.ini 中 upload_max_filesize 选项限制的值', 1);
  29. break;
  30. case UPLOAD_ERR_FORM_SIZE:
  31. throw new UploadException('上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值', 2);
  32. break;
  33. case UPLOAD_ERR_PARTIAL:
  34. throw new UploadException('文件只有部分被上传', 3);
  35. break;
  36. case UPLOAD_ERR_NO_FILE:
  37. throw new UploadException('没有文件被上传', 4);
  38. break;
  39. case UPLOAD_ERR_NO_TMP_DIR:
  40. throw new UploadException('找不到临时文件夹', 6);
  41. break;
  42. case UPLOAD_ERR_CANT_WRITE:
  43. throw new UploadException('文件写入失败', 7);
  44. break;
  45. default:
  46. // 测试时建议关掉default: 避免误报影响
  47. throw new UploadException('未知类型错误', 8);
  48. }
  49. }
  50. // 判断文件类型
  51. $fileType = $_FILES['my_pic']['type'];
  52. if (strstr($fileType, '/', true) !== 'image') throw new UploadException('文件类型错误',9);
  53. // 将文件从临时目录 移动到用户自定义的目标目录中
  54. // 临时文件名
  55. $tempFileName = $_FILES['my_pic']['tmp_name'];
  56. if (is_uploaded_file($tempFileName)) {
  57. // 原始文件名
  58. $originalFileName = $_FILES['my_pic']['name'];
  59. // 目录文件名
  60. $destFileName = 'uploads/'.md5(time().mt_rand(1,1000)).strstr($originalFileName, '.');
  61. // 移动文件到目标目录使用的函数
  62. if (move_uploaded_file($tempFileName, $destFileName)) {
  63. echo "<p>$originalFileName: 上传成功~~</p>";
  64. // 预览
  65. echo "<img src='{$destFileName}' width='200'>";
  66. }
  67. }
  68. } catch (UploadException $e) {
  69. echo $e;
  70. }
  71. ?>
  72. <!DOCTYPE html>
  73. <html lang="en">
  74. <head>
  75. <meta charset="UTF-8">
  76. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  77. <title>文件上传变量$_FILES</title>
  78. </head>
  79. <body>
  80. <hr>
  81. <form action="" method="POST" enctype="multipart/form-data">
  82. <fieldset>
  83. <legend>单文件上传: 异常处理</legend>
  84. <input type="hidden" name="MAX_FILE_SIZE" value="3000000">
  85. <input type="file" name="my_pic">
  86. <button>上传</button>
  87. </fieldset>
  88. </form>
  89. </body>
  90. </html>

上传成功运行效果:

上传错误运行效果:

2.多文件上传

  1. <?php
  2. class UploadException extends Exception
  3. {
  4. // 在异常子类中,可以访问并重写Exception中的四个属性,通过__toString()格式化异常输出信息
  5. public function __toString()
  6. {
  7. return <<< UPLOAD
  8. <style>
  9. table {border-collapse: collapse;border:1px solid black;text-align: center;}
  10. td {border:1px solid black;padding: 5px;}
  11. tr:first-of-type {background-color:#eee;}
  12. tr:last-of-type td {color: coral;}
  13. </style>
  14. <table>
  15. <tr><td>代码</td><td>信息</td><td>文件</td><td>行号</td></tr>
  16. <tr><td>$this->code</td><td>$this->message</td><td>$this->file</td><td>$this->line</td></tr>
  17. </table>
  18. UPLOAD;
  19. }
  20. }
  21. try {
  22. foreach ($_FILES as $file) {
  23. // 上传出错的代码
  24. $errorCode = $file['error'];
  25. if ($errorCode > UPLOAD_ERR_OK) {
  26. switch ($errorCode) {
  27. case UPLOAD_ERR_INI_SIZE:
  28. throw new UploadException('上传的文件超过了 php.ini 中 upload_max_filesize 选项限制的值', 1);
  29. break;
  30. case UPLOAD_ERR_FORM_SIZE:
  31. throw new UploadException('上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值', 2);
  32. break;
  33. case UPLOAD_ERR_PARTIAL:
  34. throw new UploadException('文件只有部分被上传', 3);
  35. break;
  36. case UPLOAD_ERR_NO_FILE:
  37. throw new UploadException('没有文件被上传', 4);
  38. break;
  39. case UPLOAD_ERR_NO_TMP_DIR:
  40. throw new UploadException('找不到临时文件夹', 6);
  41. break;
  42. case UPLOAD_ERR_CANT_WRITE:
  43. throw new UploadException('文件写入失败', 7);
  44. break;
  45. default:
  46. // 测试时建议关掉default: 避免误报影响
  47. throw new UploadException('未知类型错误', 8);
  48. }
  49. }
  50. // 只要判断 error === 0
  51. if ($file['error'] === 0) {
  52. // 判断文件类型
  53. // print_r($file) ;
  54. $fileType = $file['type'];
  55. if (strstr($fileType, '/', true) !== 'image') throw new UploadException('文件类型错误',9);
  56. $tempFileName = $file['tmp_name'];
  57. if (is_uploaded_file($tempFileName)) {
  58. // 原始文件名
  59. $originalFileName = $file['name'];
  60. // 目录文件名
  61. $destFileName = 'uploads/'.md5(time().mt_rand(1,1000)).strstr($originalFileName, '.');
  62. // 移动文件到目标目录使用的函数
  63. if (move_uploaded_file($tempFileName, $destFileName)) {
  64. echo "<p>$originalFileName: 上传成功~~</p>";
  65. // 预览
  66. echo "<img src='{$destFileName}' width='200'>";
  67. }
  68. }
  69. }
  70. }
  71. } catch (UploadException $e) {
  72. echo $e;
  73. }
  74. ?>
  75. <!DOCTYPE html>
  76. <html lang="en">
  77. <head>
  78. <meta charset="UTF-8">
  79. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  80. <title>文件上传变量$_FILES</title>
  81. </head>
  82. <body>
  83. <hr>
  84. <form action="" method="POST" enctype="multipart/form-data">
  85. <fieldset>
  86. <legend>多文件上传: 逐个上传(一)</legend>
  87. <input type="hidden" name="MAX_FILE_SIZE" value="3000000">
  88. <input type="file" name="my_pic1">
  89. <input type="file" name="my_pic2">
  90. <input type="file" name="my_pic3">
  91. <button>上传</button>
  92. </fieldset>
  93. </form>
  94. </body>
  95. </html>

多文件上传成功运行效果:

多文件上传错误运行效果:

3.多文件批量上传

  1. <?php
  2. class UploadException extends Exception
  3. {
  4. // 在异常子类中,可以访问并重写Exception中的四个属性,通过__toString()格式化异常输出信息
  5. public function __toString()
  6. {
  7. return <<< UPLOAD
  8. <style>
  9. table {border-collapse: collapse;border:1px solid black;text-align: center;}
  10. td {border:1px solid black;padding: 5px;}
  11. tr:first-of-type {background-color:#eee;}
  12. tr:last-of-type td {color: coral;}
  13. </style>
  14. <table>
  15. <tr><td>代码</td><td>信息</td><td>文件</td><td>行号</td></tr>
  16. <tr><td>$this->code</td><td>$this->message</td><td>$this->file</td><td>$this->line</td></tr>
  17. </table>
  18. UPLOAD;
  19. }
  20. }
  21. try {
  22. if ($_FILES['my_pic'])
  23. // print_r($_FILES['my_pic']);
  24. foreach ($_FILES['my_pic']['error'] as $key => $error) {
  25. // 只要判断 error === 0
  26. // 上传出错的代码
  27. $errorCode=$_FILES['my_pic']['error'][$key];
  28. if ($error === UPLOAD_ERR_OK) {
  29. // 临时文件名
  30. $tmpFileName = $_FILES['my_pic']['tmp_name'][$key];
  31. // 原始文件名
  32. $originalFileName = $_FILES['my_pic']['name'][$key];
  33. // 目标文件名
  34. $destFileName = 'uploads/'. $originalFileName;
  35. // 移动文件
  36. move_uploaded_file($tmpFileName, $destFileName);
  37. // 预览
  38. echo "<img src='{$destFileName}' width='200'>";
  39. }else{
  40. switch ($error) {
  41. case UPLOAD_ERR_INI_SIZE:
  42. throw new UploadException('上传的文件超过了 php.ini 中 upload_max_filesize 选项限制的值', 1);
  43. break;
  44. case UPLOAD_ERR_FORM_SIZE:
  45. throw new UploadException('上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值', 2);
  46. break;
  47. case UPLOAD_ERR_PARTIAL:
  48. throw new UploadException('文件只有部分被上传', 3);
  49. break;
  50. case UPLOAD_ERR_NO_FILE:
  51. throw new UploadException('没有文件被上传', 4);
  52. break;
  53. case UPLOAD_ERR_NO_TMP_DIR:
  54. throw new UploadException('找不到临时文件夹', 6);
  55. break;
  56. case UPLOAD_ERR_CANT_WRITE:
  57. throw new UploadException('文件写入失败', 7);
  58. break;
  59. default:
  60. // 测试时建议关掉default: 避免误报影响
  61. // throw new UploadException('未知类型错误', 8);
  62. }
  63. }
  64. // if ($errorCode > UPLOAD_ERR_OK) {
  65. // switch ($errorCode) {
  66. // case UPLOAD_ERR_INI_SIZE:
  67. // throw new UploadException('上传的文件超过了 php.ini 中 upload_max_filesize 选项限制的值', 1);
  68. // break;
  69. // case UPLOAD_ERR_FORM_SIZE:
  70. // throw new UploadException('上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值', 2);
  71. // break;
  72. // case UPLOAD_ERR_PARTIAL:
  73. // throw new UploadException('文件只有部分被上传', 3);
  74. // break;
  75. // case UPLOAD_ERR_NO_FILE:
  76. // throw new UploadException('没有文件被上传', 4);
  77. // break;
  78. // case UPLOAD_ERR_NO_TMP_DIR:
  79. // throw new UploadException('找不到临时文件夹', 6);
  80. // break;
  81. // case UPLOAD_ERR_CANT_WRITE:
  82. // throw new UploadException('文件写入失败', 7);
  83. // break;
  84. // default:
  85. // // 测试时建议关掉default: 避免误报影响
  86. // // throw new UploadException('未知类型错误', 8);
  87. // }
  88. // }else{
  89. // }
  90. // if ($error === UPLOAD_ERR_OK) {
  91. // // 临时文件名
  92. // $tmpFileName = $_FILES['my_pic']['tmp_name'][$key];
  93. // // 原始文件名
  94. // $originalFileName = $_FILES['my_pic']['name'][$key];
  95. // // 目标文件名
  96. // $destFileName = 'uploads/'. $originalFileName;
  97. // // 移动文件
  98. // move_uploaded_file($tmpFileName, $destFileName);
  99. // // 预览
  100. // echo "<img src='{$destFileName}' width='200'>";
  101. // }
  102. }
  103. } catch (UploadException $e) {
  104. echo $e;
  105. }
  106. ?>
  107. <!DOCTYPE html>
  108. <html lang="en">
  109. <head>
  110. <meta charset="UTF-8">
  111. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  112. <title>文件上传变量$_FILES</title>
  113. </head>
  114. <body>
  115. <hr>
  116. <form action="" method="POST" enctype="multipart/form-data">
  117. <fieldset>
  118. <legend>多文件上传: 批量上传</legend>
  119. <input type="hidden" name="MAX_FILE_SIZE" value="3000000">
  120. <!-- 将name属性值能数组的形式提供 -->
  121. <input type="file" name="my_pic[]" multiple>
  122. <button>上传</button>
  123. </fieldset>
  124. </form>
  125. </body>
  126. </html>

多文件批量上传成功运行效果:

多文件批量上传错误运行效果:

总结

1.文件的上传流程

选择文件->上传到临时目录->转存到指定目录->反馈是否上传成功

2.文件的上传限制

限制文件大小、限制文件类型、限制上传方式、限制上传数量等等,主要是保证服务器的安全及正常运行

3.文件上传的错误处理

目的是根据错误代号友好的反馈给用户

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