Blogger Information
Blog 29
fans 0
comment 0
visits 26998
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
PHP基础:单文件上传、多文件上传、批量上传
暴宇
Original
1710 people have browsed it

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.文件上传的错误处理

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

Correcting teacher:天蓬老师天蓬老师

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
About us Disclaimer Sitemap
php.cn:Public welfare online PHP training,Help PHP learners grow quickly!