Blogger Information
Blog 30
fans 0
comment 1
visits 21953
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
0219 php文件上传&php多文件上传
Admin
Original
644 people have browsed it

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. }

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

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