Blogger Information
Blog 25
fans 1
comment 1
visits 17364
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
0219作业+文件上传处理+10期线上班
江川林
Original
614 people have browsed it

上传文件的大体思路

①需了解以下知识,部分

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

谢谢老师审阅!

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