博客列表 >0219作业+文件上传处理+10期线上班

0219作业+文件上传处理+10期线上班

江川林
江川林原创
2020年02月26日 18:04:46615浏览

上传文件的大体思路

①需了解以下知识,部分

-修改php.inifile_uploads:On,一般默认就是On
-upload_tmp_dir=:文件上传至服务器上存储临时文件的地址
-upload_max_filesize=100m:允许上传文件大小的最大值
-is_uploaded_file():判断上传文件的合法性(是否通过HTTP POST上传),注意:判断的是临时文件名
-move_uploaded_file($var1, $var2):将临时文件移至目标文件,第一个参数是临时文件名,第一个参数目标文件名(需带路径)

②上传文件判断的步骤

-判断文件是否上传成功
(根据error的值判断)
-判断文件是否合法上传
(同时可判断文件类型等)
-将临时文件移至目标文件中
(注意将目标文件加密,防止重复命名,文件覆盖)

单文件上传——仅限PDF格式

以下是单文件上传代码

  1. <?php
  2. namespace chapter9;
  3. use Exception;
  4. require 'config.php';
  5. //处理用户的文件上传,需要三步
  6. //- 判断文件是否上传成功
  7. //- 判断文件是否合法上传
  8. //- 将临时文件移动到用户目录中
  9. //var_dump($_FILES['pdf_file']['error']);
  10. try {
  11. // 1,判断文件是否上传成功
  12. $error = $_FILES['pdf_file']['error'];
  13. if ($error > UPLOAD_ERR_OK) {
  14. switch ($error) {
  15. case UPLOAD_ERR_INI_SIZE:
  16. throw new Exception('上传文件超过了`php.ini`配置文件中`upload_max_filesize`的设定最大内存');
  17. break;
  18. case UPLOAD_ERR_FORM_SIZE:
  19. throw new Exception('文件大小超过了HTML表单中MAX_FILE_SIZE的大小');
  20. break;
  21. case UPLOAD_ERR_PARTIAL:
  22. throw new Exception('仅上传了部分文件');
  23. break;
  24. case UPLOAD_ERR_NO_FILE:
  25. throw new Exception('没有文件上传');
  26. break;
  27. case UPLOAD_ERR_NO_TMP_DIR:
  28. throw new Exception('找不到临时文件');
  29. break;
  30. case UPLOAD_ERR_CANT_WRITE:
  31. throw new Exception('文件写入失败');
  32. break;
  33. default:
  34. throw new Exception('不明了的上传错误');
  35. }
  36. } else {
  37. // 判断临时文件是否合法:用临时文件名判断
  38. // 导出临时文件
  39. $tmp_name = $_FILES['pdf_file']['tmp_name'];
  40. // 限制上传文件的文件类型
  41. $type = 'pdf';
  42. // 进行判断
  43. if (is_uploaded_file($tmp_name) === true) {
  44. // 获取上传文件的扩展名
  45. $extension = pathinfo($_FILES['pdf_file']['name'])['extension'];
  46. if ($extension === $type) {
  47. // 创建用户文件名(目标用户目录)
  48. $user_dir = 'userdir/' . md5($_FILES['pdf_file']['name'] . time()) . '.' . $extension;
  49. // 移动临时文件合法则移到用户目录中去
  50. if (move_uploaded_file($tmp_name, $user_dir)) {
  51. echo '移动成功';
  52. }
  53. } else {
  54. throw new Exception('文件上传类型不符,请按规定上传');
  55. }
  56. } else {
  57. throw new Exception('非法文件上传');
  58. }
  59. }
  60. } catch (Exception $e) {
  61. echo $e->getMessage();
  62. }

多文件上传

多文件上传大体思路跟单文件差不多,但要注意的是

-因为$_FILES打印出来的多文件数组是根据键名进行分类,所以在判断文件是否上传成功之前,要先对数组进行重组

以下是处理多文件上传的代码

  1. <?php
  2. namespace chapter9;
  3. use Exception;
  4. //print_r($_FILES['more_files']);
  5. //$more_files = $_FILES['more_files'];
  6. //die;
  7. //echo '<hr>';
  8. //因为上传多个文件,$_FILES所打印出来的页面是将各键名分类的,所以要将各文件的信息重新编排下
  9. try {
  10. // 创建一个数组容器,来装各个上传文件的内容
  11. $more_files = [];
  12. // 用for()循环重新遍历上传文件的信息,并将其封装到数组容器中
  13. for ($i = 0; $i < count($_FILES['more_files']['name']); $i++) {
  14. $more_files[] = [
  15. 'name' => $_FILES['more_files']['name'][$i],
  16. 'type' => $_FILES['more_files']['type'][$i],
  17. 'tmp_name' => $_FILES['more_files']['tmp_name'][$i],
  18. 'error' => $_FILES['more_files']['error'][$i],
  19. 'size' => $_FILES['more_files']['size'][$i]
  20. ];
  21. }
  22. // print_r($more_files);
  23. // 然后用foreach()循环遍历出各个数组,重新组成新的数组
  24. foreach ($more_files as $file) {
  25. if ($file['error'] > UPLOAD_ERR_OK) {
  26. switch ($file['error']) {
  27. case UPLOAD_ERR_INI_SIZE:
  28. throw new Exception('上传文件超过了`php.ini`配置文件中`upload_max_filesize`的设定最大内存');
  29. case UPLOAD_ERR_FORM_SIZE:
  30. throw new Exception('文件大小超过了HTML表单中MAX_FILE_SIZE的大小');
  31. case UPLOAD_ERR_PARTIAL:
  32. throw new Exception('仅上传了部分文件');
  33. break;
  34. case UPLOAD_ERR_NO_FILE:
  35. throw new Exception('没有文件上传');
  36. break;
  37. case UPLOAD_ERR_NO_TMP_DIR:
  38. throw new Exception('找不到临时文件');
  39. break;
  40. case UPLOAD_ERR_CANT_WRITE:
  41. throw new Exception('文件写入失败');
  42. break;
  43. default:
  44. throw new Exception('不明了的上传错误');
  45. }
  46. } else {
  47. // 文件以没有问题,现在判断上传文件是否是通过HTTP POST合法上传
  48. // 2,判断合法性
  49. if (is_uploaded_file($file['tmp_name']) === true) {
  50. // 如合法,再判断是否符合规定的文件类型,以下是规定文件类型
  51. $type = ['jpg', 'jpeg', 'png', 'gif'];
  52. // 获取上传文件的文档类型后缀
  53. $extension = pathinfo($file['name'])['extension'];
  54. // 判断是否文件类型
  55. if (in_array($extension, $type)) {
  56. // 如何符合类型,接着就将临时文件移动到目标文件里面去
  57. // 获取临时文件
  58. $tmp_file = $file['tmp_name'];
  59. // 创建目标文件(是文件路径的形式),路径+上传文件的文件名
  60. $user_file = 'userdir/' . md5($file['name']) . time() . '.' .$extension;
  61. // 移动临时文件
  62. if (move_uploaded_file($tmp_file, $user_file)){
  63. echo '上传成功';
  64. }
  65. }else{throw new Exception('文件上传类型不符,请按规定上传');}
  66. }else{throw new Exception('非法文件上传');}
  67. }
  68. }
  69. // 1, 判断文件是否上传成功
  70. } catch (Exception $e) {
  71. echo $e->getMessage();
  72. }

调用其他脚本的函数来处理文件上传

我的思路是直接将文件上传处理的函数的一部分,修改关键的一部分,剪切后封装到另一个脚本的函数中,如下:

这样,在处理文件上传的脚本中,只要加载此脚本,调用里面的函数就行,不知道这样对不对,往老师指出,以下代码只是判断文件是否上传成功这部分

  1. <?php
  2. namespace chapter9;
  3. use Exception;
  4. //获取$_FILES数组里面的键名(就是HTML页面,上传文件的name属性)
  5. function config()
  6. {
  7. switch ($_FILES[key($_FILES)]['error']) {
  8. case UPLOAD_ERR_INI_SIZE:
  9. throw new Exception('上传文件超过了`php.ini`配置文件中`upload_max_filesize`的设定最大内存');
  10. break;
  11. case UPLOAD_ERR_FORM_SIZE:
  12. throw new Exception('文件大小超过了HTML表单中MAX_FILE_SIZE的大小');
  13. break;
  14. case UPLOAD_ERR_PARTIAL:
  15. throw new Exception('仅上传了部分文件');
  16. break;
  17. case UPLOAD_ERR_NO_FILE:
  18. throw new Exception('没有文件上传');
  19. break;
  20. case UPLOAD_ERR_NO_TMP_DIR:
  21. throw new Exception('找不到临时文件');
  22. break;
  23. case UPLOAD_ERR_CANT_WRITE:
  24. throw new Exception('文件写入失败');
  25. break;
  26. default:
  27. throw new Exception('不明了的上传错误');
  28. }
  29. }

附加作业:处理单个文件上传的通用类

我的思路:既然是通用类,那不管在任何文件中都可以使用,所以就要用预定义函数来获取HTML页面中,input代码里的name值,所以我就要key($_FILES)获取name的值,替代PHP脚本的相对应的代码,以下为具体代码:

  1. <?php
  2. namespace chapter9;
  3. use Exception;
  4. class Current
  5. {
  6. public function config()
  7. {
  8. try
  9. {
  10. // 1,判断文件是否上传成功
  11. if ($_FILES[key($_FILES)]['error'] > UPLOAD_ERR_OK)
  12. {
  13. switch ($_FILES[key($_FILES)]['error'])
  14. {
  15. case UPLOAD_ERR_INI_SIZE:
  16. throw new Exception('上传文件超过了`php.ini`配置文件中`upload_max_filesize`的设定最大内存');
  17. break;
  18. case UPLOAD_ERR_FORM_SIZE:
  19. throw new Exception('上传文件大小超过了HTML表单中`MAX_FILE_SIZE`规定的大小');
  20. break;
  21. case UPLOAD_ERR_PARTIAL:
  22. throw new Exception('仅上传了部分文件');
  23. break;
  24. case UPLOAD_ERR_NO_FILE:
  25. throw new Exception('没有文件上传');
  26. break;
  27. case UPLOAD_ERR_NO_TMP_DIR:
  28. throw new Exception('找不到临时文件');
  29. break;
  30. case UPLOAD_ERR_CANT_WRITE:
  31. throw new Exception('文件写入失败');
  32. break;
  33. default:
  34. throw new Exception('不明了的上传错误');
  35. }
  36. }else {
  37. // 判断临时文件是否合法:用临时文件名判断
  38. // 导出临时文件
  39. $tmp_name = $_FILES[key($_FILES)]['tmp_name'];
  40. // 限制上传文件的文件类型
  41. $type = ['txt', 'jpg', 'jpeg', 'gif', 'pdf'];
  42. // 进行判断
  43. if (is_uploaded_file($tmp_name) === true) {
  44. // 获取上传文件的扩展名
  45. $extension = pathinfo($_FILES[key($_FILES)]['name'])['extension'];
  46. if (in_array($extension, $type)) {
  47. // 创建用户文件名(目标用户目录)
  48. $user_dir = 'userdir/' . md5($_FILES[key($_FILES)]['name'] . time()) . '.' . $extension;
  49. // 移动临时文件合法则移到用户目录中去
  50. if (move_uploaded_file($tmp_name, $user_dir)) {
  51. echo '移动成功';
  52. }
  53. } else {
  54. throw new Exception('文件上传类型不符,请按规定上传');
  55. }
  56. } else {
  57. throw new Exception('非法文件上传');
  58. }
  59. }
  60. }catch
  61. (Exception $e){
  62. echo $e->getMessage();
  63. }
  64. }
  65. }

谢谢老师审阅!

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