博客列表 >PHP 文件上传------PHP第十期线上班 学号:510251 02月19日作业

PHP 文件上传------PHP第十期线上班 学号:510251 02月19日作业

赵大叔
赵大叔原创
2020年04月01日 01:32:29527浏览

文件上传

相关知识点:

1、PHP配置:

  • 1.1 file_upload: On / Off 是否允许上传文件
  • 1.2 upload_tmp_dir: 文件上传临时目录
  • 1.3 upload_max_filesize: 默认32M, 单个文件上传的最大尺寸
  • 1.4 post_max_size: 允许通过post方式提交的数据量大小, 至少要大于upload_max_filesize
  • 1.5 max_file_uploads: 默认20, 单个请求, 允许上传的最大文件数量

2、相关函数:

  • 2.1 is_uploaded_file(): 检测是否是通过POST方式上传的文件,——检测临时文件是否合法
  • 2.2 move_uploaded_file(): 移动临时文件到用户自定义的目录中
  • 2.3 $_FILES: 超全局变量,以数组形式展示上传文件的一些基础信息

  • 2.4 错误信息:
    0: UPLOAD_ERR_OK, 没有错误发生,文件上传成功
    1: UPLOAD_ERR_INI_SIZE, 上传的文件超过了 php.ini 中 upload_max_filesize选项限制的值
    2: UPLOAD_ERR_FORM_SIZE, 上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值
    3: UPLOAD_ERR_PARTIAL, 文件只有部分被上传(网络临时中断,只有部分上传)
    4: UPLOAD_ERR_NO_FILE, 没有文件被上传
    6: UPLOAD_ERR_NO_TMP_DIR, 找不到临时文件目录(文件夹或改动,极少遇到,除非人为恶意)
    7: UPLOAD_ERR_CANT_WRITE, 文件写入失败, 上传目录无写的权限


单文件上传

html代码

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>PDF文件上传</title>
  6. </head>
  7. <body>
  8. <!-- action:处理上传脚本, method: 必须是POST, multipart/form-data:允许接收表单提交的文件 -->
  9. <form action="demo2.php" method="POST" enctype="multipart/form-data">
  10. <fieldset>
  11. <legend>PDF文件上传</legend>
  12. <!-- 这个上传文件大小的限制字段,必须写到file字段的前面 -->
  13. <input type="hidden" name="MAX_FILE_SIZE" value="600">
  14. <input type="file" name="user_pic">
  15. <button>上传</button>
  16. </fieldset>
  17. </form>
  18. </body>
  19. </html>

php代码

  1. <?php
  2. namespace chapter8;
  3. use Exception;
  4. // 处理用户文件上传
  5. try {
  6. // 1. 判断文件是否上传成功:查看user_pic键下error的值
  7. $errorCode = $_FILES['user_file']['error'];
  8. if ( $errorCode > UPLOAD_ERR_OK) {
  9. switch ($errorCode) {
  10. case UPLOAD_ERR_INI_SIZE:
  11. throw new Exception('上传的文件超过了php.ini中upload_max_filesize选项限制的值');
  12. break;
  13. case UPLOAD_ERR_FORM_SIZE:
  14. throw new Exception('上传文件的大小超过了HTML表单中 MAX_FILE_SIZE选项指定的值');
  15. break;
  16. case UPLOAD_ERR_PARTIAL:
  17. throw new Exception('文件只有部分被上传');
  18. break;
  19. case UPLOAD_ERR_NO_FILE:
  20. throw new Exception('没有文件被上传');
  21. break;
  22. case UPLOAD_ERR_NO_TMP_DIR:
  23. throw new Exception('找不到临时文件夹');
  24. break;
  25. case UPLOAD_ERR_CANT_WRITE:
  26. throw new Exception('文件写入失败');
  27. break;
  28. default:
  29. throw new Exception('未知类型错误');
  30. }
  31. }
  32. // 2. 判断临时文件是否合法:
  33. $tmpFile = $_FILES['user_file']['tmp_name'];
  34. if (true === is_uploaded_file($tmpFile)) {
  35. // 获取上传文件的扩展名
  36. $extension = pathinfo($_FILES['user_file']['name'])['extension'];
  37. if ($extension === 'pdf') {
  38. // 目标文件名
  39. $destName = 'uploads/' . md5($_FILES['user_file']['name']).time() . '.' . $extension;
  40. // 3. 将临时文件移动到用户目录中
  41. if (move_uploaded_file($tmpFile, $destName)) {
  42. echo '<script>alert("上传成功");location.href="form1.html";</script>';
  43. }
  44. } else {
  45. throw new Exception('文件类型错误');
  46. }
  47. } else {
  48. throw new Exception('非法操作');
  49. }
  50. } catch (Exception $e) {
  51. echo $e->getMessage();
  52. }

多文件上传

html代码

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>上传文件</title>
  6. </head>
  7. <body>
  8. <!-- action:处理上传脚本, method: 必须是POST, multipart/form-data:允许接收表单提交的文件 -->
  9. <form action="demo3.php" method="POST" enctype="multipart/form-data">
  10. <fieldset>
  11. <legend>文件上传</legend>
  12. <!-- 控件名称有数组方式表示-->
  13. <input type="file" name="user_pic[]">
  14. <input type="file" name="user_pic[]">
  15. <input type="file" name="user_pic[]">
  16. <input type="file" name="user_pic[]">
  17. <button>上传</button>
  18. </fieldset>
  19. </form>
  20. </body>
  21. </html>

php代码

  1. <?php
  2. namespace chapter8;
  3. use Exception;
  4. // print_r($_FILES);
  5. // 目标: 将这个二维数组转为一维格式
  6. // $images: 创建一个数组保存所有已经格式化后的每个文件的信息
  7. $images = [];
  8. foreach ($_FILES as $value) {
  9. //判断是否是多文件上传:$_FILES里面任意一个键是数组就是
  10. if (is_array($value['name'])) {
  11. for ($i = 0; $i < count($value['name']); $i++) {
  12. $images[] = [
  13. 'name' => $value['name'][$i],
  14. 'type' => $value['type'][$i],
  15. 'tmp_name' => $value['tmp_name'][$i],
  16. 'error' => $value['error'][$i],
  17. 'size' => $value['size'][$i],
  18. ];
  19. }
  20. }
  21. }
  22. echo '<hr>';
  23. //print_r($images);
  24. //再次遍历获取到的数组
  25. foreach ($images as $image) {
  26. try {
  27. // 1. 判断文件是否上传成功?
  28. $errorCode = $image['error'];
  29. if ( $errorCode > UPLOAD_ERR_OK) {
  30. switch ($errorCode) {
  31. case UPLOAD_ERR_INI_SIZE:
  32. throw new Exception('上传的文件超过了 php.ini 中 upload_max_filesize 选项限制的值');
  33. break;
  34. case UPLOAD_ERR_FORM_SIZE:
  35. throw new Exception('上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值');
  36. break;
  37. case UPLOAD_ERR_PARTIAL:
  38. throw new Exception('文件只有部分被上传');
  39. break;
  40. case UPLOAD_ERR_NO_FILE:
  41. throw new Exception('没有文件被上传');
  42. break;
  43. case UPLOAD_ERR_NO_TMP_DIR:
  44. throw new Exception('找不到临时文件夹');
  45. break;
  46. case UPLOAD_ERR_CANT_WRITE:
  47. throw new Exception('文件写入失败');
  48. break;
  49. default:
  50. throw new Exception('未知类型错误');
  51. }
  52. }
  53. // 2. 判断临时文件是否合法?
  54. $tmpFile = $image['tmp_name'];
  55. // 设置允许上传文件类型
  56. $allowFileTypes = ['jpg', 'jpeg', 'png', 'gif'];
  57. if (true === is_uploaded_file($tmpFile)) {
  58. // 获取上传文件的扩展名
  59. $extension = pathinfo($image['name'])['extension'];
  60. if (in_array($extension, $allowFileTypes)) {
  61. // 目标文件名
  62. $destName = 'uploads/' . md5($image['name']).time() . '.' . $extension;
  63. // 3. 将临时文件移动到用户目录中
  64. if (move_uploaded_file($tmpFile, $destName)) {
  65. echo '<script>alert("上传成功");location.href="form2.html";</script>';
  66. }
  67. } else {
  68. throw new Exception('文件类型错误');
  69. }
  70. } else {
  71. throw new Exception('非法操作');
  72. }
  73. } catch (Exception $e) {
  74. echo $e->getMessage();
  75. }
  76. }
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议