博客列表 >文件上传案例(单文件/多文件以及批量上传)

文件上传案例(单文件/多文件以及批量上传)

我是郭富城
我是郭富城原创
2020年05月12日 23:41:391484浏览

文件上传案例

1.基础

  • 前端页面要做的是,首先是提交方式必须修改为 post,因为文件上传和大数据的传输,post 更合适。需要注意的地方如下:
  • 然后当前端页面提交后,剩余的就是我们后端需要处理的事情了。首先获得文件的后缀名。并对文件的存放位置进行设定。
  • 这里使用 PHP 的全局数组$_FILES 来实现文件上传:

$_FILES["file"]["name"] - 被上传文件的名称

$_FILES["file"]["type"] - 被上传文件的类型

$_FILES["file"]["size"] - 被上传文件的大小,以字节计

$_FILES["file"]["tmp_name"] - 存储在服务器的文件的临时副本的名称

$_FILES["file"]["error"] - 由文件上传导致的错误代码

其他具体的在案例中注意注释部分

2. 单文件上传案例

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

3. 多文件上传案例

3.1 通过定义不同的上传文件名属性方式

  1. <?php
  2. // printf('<pre>%s</pre>', print_r($_FILES, true));
  3. foreach ($_FILES as $file) {
  4. // 只要判断 error === 0
  5. if ($file['error'] === 0) {
  6. $destinationFile = 'uploads/' . md5(time() . mt_rand(1, 10000)) . strstr($file['name'], '.');
  7. move_uploaded_file($file['tmp_name'], $destinationFile);
  8. echo "<img src='{$destinationFile}' width='200'>";
  9. }
  10. }
  11. ?>
  12. <!DOCTYPE html>
  13. <html lang="en">
  14. <head>
  15. <meta charset="UTF-8" />
  16. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  17. <title>多文件上传</title>
  18. </head>
  19. <body>
  20. <h3>多文件上传</h3>
  21. <form action="" method="POST" enctype="multipart/form-data">
  22. <fieldset>
  23. <legend>逐一上传多个文件</legend>
  24. <input type="file" name="my_pic1">
  25. <input type="file" name="my_pic2">
  26. <button>点击上传</button>
  27. </fieldset>
  28. </form>
  29. </body>
  30. </html>

3.2 通过数组的方式定义文件名属性

  1. <?php
  2. printf('<pre>%s</pre>', print_r($_FILES, true));
  3. if ($_FILES['my_pic'])
  4. foreach ($_FILES['my_pic']['error'] as $key => $error) {
  5. // 只要判断 error === 0
  6. if ($error === UPLOAD_ERR_OK) {
  7. // 临时文件名
  8. $tmpFileName = $_FILES['my_pic']['tmp_name'][$key];
  9. // 原始文件名
  10. $originalFileName = $_FILES['my_pic']['name'][$key];
  11. // 目标文件名
  12. $destFileName = 'uploads/' . $originalFileName;
  13. // 移动文件
  14. move_uploaded_file($tmpFileName, $destFileName);
  15. // 预览
  16. echo "<img src='{$destFileName}' width='200'>";
  17. }
  18. }
  19. ?>
  20. <!DOCTYPE html>
  21. <html lang="en">
  22. <head>
  23. <meta charset="UTF-8" />
  24. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  25. <title>多文件上传</title>
  26. </head>
  27. <body>
  28. <h3>多文件上传</h3>
  29. <form action="" method="POST" enctype="multipart/form-data">
  30. <fieldset>
  31. <legend>逐一上传多个文件</legend>
  32. <input type="file" name="my_pic[]">
  33. <input type="file" name="my_pic[]">
  34. <input type="file" name="my_pic[]">
  35. <button>点击上传</button>
  36. </fieldset>
  37. </form>
  38. </body>
  39. </html>

4. 批量上传案例

  • 增加参数multiple
  1. <?php
  2. printf('<pre>%s</pre>', print_r($_FILES, true));
  3. if ($_FILES['my_pic'])
  4. foreach ($_FILES['my_pic']['error'] as $key => $error) {
  5. // 只要判断 error === 0
  6. if ($error === UPLOAD_ERR_OK) {
  7. // 临时文件名
  8. $tmpFileName = $_FILES['my_pic']['tmp_name'][$key];
  9. // 原始文件名
  10. $originalFileName = $_FILES['my_pic']['name'][$key];
  11. // 目标文件名
  12. $destFileName = 'uploads/' . $originalFileName;
  13. // 移动文件
  14. move_uploaded_file($tmpFileName, $destFileName);
  15. // 预览
  16. echo "<img src='{$destFileName}' width='200'>";
  17. }
  18. }
  19. ?>
  20. <!DOCTYPE html>
  21. <html lang="en">
  22. <head>
  23. <meta charset="UTF-8" />
  24. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  25. <title>多文件上传</title>
  26. </head>
  27. <body>
  28. <h3>多文件上传</h3>
  29. <form action="" method="POST" enctype="multipart/form-data">
  30. <fieldset>
  31. <legend>逐一上传多个文件</legend>
  32. <input type="file" name="my_pic[]" multiple>
  33. <button>点击上传</button>
  34. </fieldset>
  35. </form>
  36. </body>
  37. </html>

5. 上传方法封装成类

  • 封装失败,就不献丑了

    6. 总结

本节课程学习了文件上传的知识,PHP 支持同时上传多个文件并将它们的信息自动以数组的形式组织。课后尝试对上传方法进行封装,发现失败了,就没在这里展示失败的代码了,希望可以慢慢学会如何封装一个类。

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