PHP多文件上传理解总结

上传文件HTML的输入标签FILE类型中的名称后要加[],作用是在HTML中向PHP建立数组,比如名称为pictures,多文件引用名称则为pictures[],实例代码如下:

  1. <form action=”upload.php” method=”post” enctype=”multipart/form-data”>
  2. <p>
  3. <input type=”file” name=”pictures[]” /><br />
  4. <input type=”file” name=”pictures[]” /><br />
  5. <input type=”file” name=”pictures[]” /><br />
  6. <input type=”submit” value=”上传” />
  7. </p>
  8. </form>

手册中实例,选择文件后点击上传,代码如下:

<?php print_r($_FILES); ?>

查看源文件,代码如下:

  1. Array
  2. (
  3. [pictures] => Array
  4. (
  5. [name] => Array
  6. (
  7. [0] => file1.txt
  8. [1] => file2.txt
  9. [2] => file3.txt
  10. )
  11. [type] => Array
  12. (
  13. [0] => application/octet-stream
  14. [1] => application/octet-stream
  15. [2] => application/octet-stream
  16. )
  17. [tmp_name] => Array
  18. (
  19. [0] => D:EasyPHP\tmpphp47.tmp
  20. [1] => D:EasyPHP\tmpphp48.tmp
  21. [2] => D:EasyPHP\tmpphp49.tmp
  22. )
  23. [error] => Array
  24. (
  25. [0] => 0
  26. [1] => 0
  27. [2] => 0
  28. )
  29. [size] => Array
  30. (
  31. [0] => 94289
  32. [1] => 65536
  33. [2] => 102400
  34. )
  35. )
  36. )

假设名为 /file1.txt和 /file2.txt 的文件被提交,则 $_FILES['pictures']['name'][0] 的值将是 file1.txt,而 $_FILES['pictures']['name'][1] 的值将是 file2.txt。类似的,$_FILES['file2.txt']['size'][0] 将包含文件 file1.txt 的大小,有了上面信息了我们要实现多文件上传就简单了,代码如下:

  1. <?php
  2. class upload {
  3. public $up_ext=array(), $up_max=5210, $up_dir;
  4. private $up_name, $up_rename=true, $up_num=0, $up_files=array(), $up_ret=array();
  5. function __construct($name, $ext=array(), $rename=true) {
  6. if (!emptyempty($name)) {
  7. $this->up_name = $name;
  8. !emptyempty($ext) && $this->up_ext = $ext;
  9. $this->up_rename = $rename;
  10. $this->up_dir = website_dirroot.
  11. $globals['cfg_upload_path'];
  12. $this->initupload();
  13. } else {
  14. exit('upload文件域名称为空,初始化失败!');
  15. }
  16. }
  17. private function initupload() {
  18. if (is_array($_files[$this->up_name])) {
  19. $up_arr = count($_files[$this->up_name]);
  20. $up_all = count($_files[$this->up_name], 1);
  21. $up_cnt = ($up_all - $up_arr) / $up_arr;
  22. for ($i = 0; $i < $up_cnt; $i ++) {
  23. if ($_files[$this->up_name]['error'][$i] != 4) {
  24. $this->up_files[] = array(
  25. 'tmp_name' => $_files[$this->up_name]['tmp_name'][$i],
  26. 'name' => $_files[$this->up_name]['name'][$i],
  27. 'type' => $_files[$this->up_name]['type'][$i],
  28. 'size' => $_files[$this->up_name]['size'][$i],
  29. 'error' => $_files[$this->up_name]['error'][$i]
  30. );
  31. }
  32. }
  33. $this->up_num = count($this->up_files);
  34. } else {
  35. if (isset($_files[$this->up_name])) {
  36. $this->up_files = array(
  37. 'tmp_name' => $_files[$this->up_name]['tmp_name'],
  38. 'name' => $_files[$this->up_name]['name'],
  39. 'type' => $_files[$this->up_name]['type'],
  40. 'size' => $_files[$this->up_name]['size'],
  41. 'error' => $_files[$this->up_name]['error']
  42. );
  43. $this->up_num = 1;
  44. } else {
  45. exit('没找找到需要upload的文件!');
  46. }
  47. }
  48. $this->chkupload();
  49. }
  50. private function chkupload() {
  51. if (emptyempty($this->up_ext)) {
  52. $up_mime = array('image/wbmp', 'image/bmp', 'image/gif', 'image/pjpeg', 'image/x-png');
  53. foreach ($this->up_files as $up_file) {
  54. $up_allw = false;
  55. foreach ($up_mime as $mime) {
  56. if ($up_file['type'] == $mime) {
  57. $up_allw = true; break;
  58. }
  59. }
  60. !$up_allw && exit('不允许上传'.$up_file['type'].'格式的文件!');
  61. if ($up_file['size'] / 1024 > $this->up_max) {
  62. exit('不允许上传大于 '.$this->up_max.'k 的文件!');
  63. }
  64. }
  65. } else {
  66. foreach ($this->up_files as $up_file) {
  67. $up_ext = end(explode('.', $up_file['name']));
  68. $up_allw = false;
  69. foreach ($this->up_ext as $ext) {
  70. if ($up_ext == $ext) {
  71. $up_allw = true; break;
  72. }
  73. }
  74. !$up_allw && exit('不允许上传.'.$up_ext.'格式的文件!');
  75. if ($up_file['size'] / 1024 > $this->up_max) {
  76. exit('不允许上传大于 '.$this->up_max.'k 的文件!');
  77. }
  78. }
  79. }
  80. $this->uploading();
  81. }
  82. private function uploading() {
  83. if (io::dircreate($this->up_dir)) {
  84. if (chmod($this->up_dir, 0777)) {
  85. if (!emptyempty($this->up_files)) {
  86. foreach ($this->up_files as $up_file) {
  87. if (is_uploaded_file($up_file['tmp_name'])) {
  88. $file_name = $up_file['name'];
  89. if ($this->up_rename) {
  90. $file_ext = end(explode('.', $file_name));
  91. $file_rnd = substr(md5(uniqid()), mt_rand(0, 26), 6);
  92. $file_name = date('ymdhis').'_'.$file_rnd.'.'.$file_ext;
  93. }
  94. $file_name = $this->up_dir.'/'.$file_name;
  95. if (move_uploaded_file($up_file['tmp_name'], $file_name)) {
  96. $this->up_ret[] = str_replace(website_dirroot, '', $file_name);
  97. } else {
  98. exit('文件上传失败!');
  99. }
  100. }
  101. }
  102. }
  103. } else {
  104. exit('未开启写入权限!');
  105. }
  106. } else {
  107. exit('上传目录创建失败!');
  108. } //开源代码phpfensi.com
  109. }
  110. public function getupload() {
  111. return emptyempty($this->up_ret) ? false : $this->up_ret;
  112. }
  113. function __destruct() {}
  114. }
  115. ?>

在上面我们会看到一个for ($i = 0; $i < $up_cnt; $i ++),这个是遍历我们上面讲的一个个实例了.