博客列表 >0219 php文件上传&php多文件上传

0219 php文件上传&php多文件上传

Admin
Admin原创
2020年03月01日 13:22:12652浏览

0219 php文件上传&php多文件上传

php文件上传

首先我们需要先了解一下PHP上传需要的配置项

  • 首先哈要完成上传文件你要先检查以下参数php.ini中的参数
  • 确保file_uploads = On 开启状态
  • upload_tmp_dir = 需要设置文件的临时目录
  • upload_max_filesize 单文件最大上传的尺寸
  • post_max_size 当前允许post上传文件的大小 post_max_size 至少要大于upload_max_filesize
  • max_file_upload 允许批量上传的文件数目
    确认可以之后我们新建一个表单

    1. <html lang="en">
    2. <head>
    3. <meta charset="UTF-8">
    4. <meta name="viewport" content="width=device-width, initial-scale=1.0">
    5. <title>Document</title>
    6. </head>
    7. <body>
    8. <form action="demo1.php" method="POST" enctype="multipart/form-data">
    9. <input type="file" name='xy_file'>
    10. <button>提交</button>
    11. </form>
    12. </body>
    13. </html>

    enctype="multipart/form-data
    千万别再表单中忘记写这个,否则你上传个锤子。
    在此之前我们先看一下PHP的文件全局量$_FILES

    所获取的到的数据分别是原始文件名,文件扩展名,临时目录,错误代码,文件大小。
    错误代码值

  • UPLOAD_ERR_OK

  • 其值为 0,没有错误发生,文件上传成功。
  • UPLOAD_ERR_INI_SIZE
  • 其值为 1,上传的文件超过了 php.ini 中 upload_max_filesize 项限制的值。
  • UPLOAD_ERR_FORM_SIZE
  • 其值为 2,上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值。
  • UPLOAD_ERR_PARTIAL
  • 其值为 3,文件只有部分被上传。
  • UPLOAD_ERR_NO_FILE
  • 其值为 4,没有文件被上传。
  • UPLOAD_ERR_NO_TMP_DIR
  • 其值为 6,找不到临时文件夹。PHP 4.3.10 和 PHP 5.0.3 引进。
  • UPLOAD_ERR_CANT_WRITE
  • 其值为 7,文件写入失败。PHP 5.1.0 引进。

    1. namespace chapter8;
    2. use Exception;
    3. /**
    4. * 1. 判断文件是否上传成功?
    5. * 2. 判断临时文件是否合法?
    6. * 3. 将临时文件移动到用户目录中
    7. */
    8. /**
    9. * UPLOAD_ERR_OK
    10. *其值为 0,没有错误发生,文件上传成功。
    11. *UPLOAD_ERR_INI_SIZE
    12. *其值为 1,上传的文件超过了 php.ini 中 upload_max_filesize 选项限制的值。
    13. *UPLOAD_ERR_FORM_SIZE
    14. *其值为 2,上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值。
    15. *UPLOAD_ERR_PARTIAL
    16. *其值为 3,文件只有部分被上传。
    17. *UPLOAD_ERR_NO_FILE
    18. *其值为 4,没有文件被上传。
    19. *UPLOAD_ERR_NO_TMP_DIR
    20. *其值为 6,找不到临时文件夹。PHP 4.3.10 和 PHP 5.0.3 引进。
    21. *UPLOAD_ERR_CANT_WRITE
    22. *其值为 7,文件写入失败。PHP 5.1.0 引进。
    23. */
    24. try {
    25. //错误代码获取
    26. $errorcode = $_FILES['xy_file']['error'];
    27. if ($errorcode > UPLOAD_ERR_OK) {
    28. switch ($errorcode) {
    29. case UPLOAD_ERR_INI_SIZE:
    30. throw new Exception('上传文件超过限定');
    31. break;
    32. case UPLOAD_ERR_FORM_SIZE:
    33. throw new Exception('超过表单中的设置文件大小');
    34. break;
    35. case UPLOAD_ERR_PARTIAL:
    36. throw new Exception('文件上传不完整');
    37. break;
    38. case UPLOAD_ERR_NO_FILE:
    39. throw new Exception('文件上传为空');
    40. break;
    41. case UPLOAD_ERR_NO_TMP_DIR:
    42. throw new Exception('未找到临时文件夹');
    43. break;
    44. case UPLOAD_ERR_CANT_WRITE:
    45. throw new Exception('文件无写入权限');
    46. break;
    47. }
    48. }
    49. //判断临时文件是否合法
    50. $file = $_FILES['xy_file']['tmp_name'];
    51. //设置允许的上传格式
    52. $filelx = ['pdf'];
    53. //is_uploaded_file — 判断文件是否是通过 HTTP POST 上传的
    54. if (is_uploaded_file($file) === true) {
    55. //那就需要开始获取文件的扩展名
    56. $filehz = pathinfo($_FILES['xy_file']['name'])['extension'];
    57. if (in_array($filehz, $filelx)) {
    58. //防止文件名重复
    59. $dir = 'uploads';
    60. if (!is_dir($dir)) {
    61. mkdir($dir);
    62. chmod($dir, 0777);
    63. // mkdir($dir,0777,true);
    64. }
    65. $destname = $dir . DIRECTORY_SEPARATOR . md5($_FILES['xy_file']['name']) . time() . '.' . $filehz;
    66. if (move_uploaded_file($file, $destname)) {
    67. echo '<script>alert("上传成功");location.href="form1.html";</script>';
    68. }
    69. } else {
    70. echo "文件上传格式不允许";
    71. }
    72. } else {
    73. echo "非法操作";
    74. }
    75. } catch (Exception $e) {
    76. echo $e->getMessage();
    77. }

    说实话对于单一文件上传来说是很简单的,只需要获取上传文件名,以及后缀,与允许的后缀列表进行比对即可,比对成功那么就用move_uploaded_file进行转移到指定目录,那么为什么要用time呢?是为了防止文件名重复。
    好我们上传一个png图片看看

    接下来我们上传一个pdf看看

    php多文件上传

    多文件上传原理也是十分简单的我们在表单处多写几个上传
    当然一般来说name我们会写成数组方式上传

    这样子我们所上传的多个文件会是一个数组
    这个文件这样子用起来会比较麻烦我们需要将他格式化!

    1. namespace chapter8;
    2. use Exception;
    3. //来一手多文件上传。
    4. //要求文件总大小不能大于10M
    5. //post_max_size 的值<=10M即可
    6. $img = [];
    7. // var_dump($_FILES);
    8. foreach ($_FILES as $value) {
    9. if (is_array($value['error'])) {
    10. for ($i = 0; $i < count($value['error']); $i++) {
    11. $img[] = [
    12. 'name' => $value['name'][$i],
    13. 'type' => $value['type'][$i],
    14. 'tmp_name' => $value['tmp_name'][$i],
    15. 'error' => $value['error'][$i],
    16. 'size' => $value['size'][$i]
    17. ];
    18. }
    19. }
    20. }
    21. // var_dump($img);
    22. //接下来已经解析为一个图片上传我们只需要重复利用一下即可
    23. foreach($img as $imgvalue) {
    24. try {
    25. //错误代码获取
    26. $errorcode =$imgvalue['error'];
    27. if ($errorcode > UPLOAD_ERR_OK) {
    28. switch ($errorcode) {
    29. case UPLOAD_ERR_INI_SIZE:
    30. throw new Exception('上传文件超过限定');
    31. break;
    32. case UPLOAD_ERR_FORM_SIZE:
    33. throw new Exception('超过表单中的设置文件大小');
    34. break;
    35. case UPLOAD_ERR_PARTIAL:
    36. throw new Exception('文件上传不完整');
    37. break;
    38. case UPLOAD_ERR_NO_FILE:
    39. throw new Exception('文件上传为空');
    40. break;
    41. case UPLOAD_ERR_NO_TMP_DIR:
    42. throw new Exception('未找到临时文件夹');
    43. break;
    44. case UPLOAD_ERR_CANT_WRITE:
    45. throw new Exception('文件无写入权限');
    46. break;
    47. }
    48. }
    49. //判断临时文件是否合法
    50. $file = $imgvalue['tmp_name'];
    51. //设置允许的上传格式
    52. $filelx = ['pdf','jpg','png','jfif'];
    53. //is_uploaded_file — 判断文件是否是通过 HTTP POST 上传的
    54. if (is_uploaded_file($file) === true) {
    55. //那就需要开始获取文件的扩展名
    56. $filehz = pathinfo($imgvalue['name'])['extension'];
    57. if (in_array($filehz, $filelx)) {
    58. //防止文件名重复
    59. $dir = 'uploads';
    60. if (!is_dir($dir)) {
    61. mkdir($dir);
    62. chmod($dir, 0777);
    63. // mkdir($dir,0777,true);
    64. }
    65. $destname = $dir . DIRECTORY_SEPARATOR . md5($imgvalue['name']) . time() . '.' . $filehz;
    66. if (move_uploaded_file($file, $destname)) {
    67. echo '<script>alert("上传成功");location.href="form1.html";</script>';
    68. }
    69. } else {
    70. echo "文件上传格式不允许";
    71. }
    72. } else {
    73. echo "非法操作";
    74. }
    75. } catch (Exception $e) {
    76. echo $e->getMessage();
    77. }
    78. }

    这样子就可以了能够完美上传!
    如何将其封装成一个函数?

    1. namespace chapter8;
    2. use Exception;
    3. function upload($file){
    4. try {
    5. //错误代码获取
    6. $errorcode = $file['error'];
    7. if ($errorcode > UPLOAD_ERR_OK) {
    8. switch ($errorcode) {
    9. case UPLOAD_ERR_INI_SIZE:
    10. throw new Exception('上传文件超过限定');
    11. break;
    12. case UPLOAD_ERR_FORM_SIZE:
    13. throw new Exception('超过表单中的设置文件大小');
    14. break;
    15. case UPLOAD_ERR_PARTIAL:
    16. throw new Exception('文件上传不完整');
    17. break;
    18. case UPLOAD_ERR_NO_FILE:
    19. throw new Exception('文件上传为空');
    20. break;
    21. case UPLOAD_ERR_NO_TMP_DIR:
    22. throw new Exception('未找到临时文件夹');
    23. break;
    24. case UPLOAD_ERR_CANT_WRITE:
    25. throw new Exception('文件无写入权限');
    26. break;
    27. }
    28. }
    29. //判断临时文件是否合法
    30. $filen = $file['tmp_name'];
    31. //设置允许的上传格式
    32. $filelx = ['pdf','jpg','png'];
    33. //is_uploaded_file — 判断文件是否是通过 HTTP POST 上传的
    34. if (is_uploaded_file($filen) === true) {
    35. //那就需要开始获取文件的扩展名
    36. $filehz = pathinfo($file['name'])['extension'];
    37. if (in_array($filehz, $filelx)) {
    38. //防止文件名重复
    39. $dir = 'uploads';
    40. if (!is_dir($dir)) {
    41. mkdir($dir);
    42. chmod($dir, 0777);
    43. // mkdir($dir,0777,true);
    44. }
    45. $destname = $dir . DIRECTORY_SEPARATOR . md5($file['name']) . time() . '.' . $filehz;
    46. if (move_uploaded_file($filen, $destname)) {
    47. echo '<script>alert("上传成功");location.href="form1.html";</script>';
    48. }
    49. } else {
    50. echo "文件上传格式不允许";
    51. }
    52. } else {
    53. echo "非法操作";
    54. }
    55. } catch (Exception $e) {
    56. echo $e->getMessage();
    57. }
    58. }

    这样子就能封装成一个公用函数!

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