首页 > 语言 > PHP > 正文

PHP多文件上传理解总结

2024-09-04 11:45:01
字体:大 中 小
来源:转载
供稿:网友

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

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

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表