三款php多文件上传实例代码

在php开发应用中经常会碰到文件上传,有时也会碰到要多文件上传,下面我们就来看看我提供的三款php多文件上传实例代码,好了费话不说多了来看看这些多文件上传功能适合你么.

示例代码如下:

  1. <form action="" method="post" enctype="multipart/form-data" >
  2. <input type="file" name="uploadfile[]"> 命名必是这样有"[]"
  3. <input type="file" name="uploadfile[]">
  4. //设置允许用户上传的文件类型。
  5. $type = array('gif', 'jpg', 'png', 'zip', 'rar');
  6. $upload = new uploadfile($_files['uploadfile'], '/', 1024*1024, $type);
  7. 参数说明:1:表单的文件,2:上传目录,3:支持文件大小,4:允许文件类型
  8. $icount = $upload->upload();
  9. if($icount > 0) { //上传成功
  10. print_r($upload->getsaveinfo());
  11. */
  12. class uploadfile {
  13. var $postfile = array(); // 用户上传的文件
  14. var $custompath = ""; // 自定义文件上传路径
  15. var $maxsize = ""; // 文件最大尺寸
  16. var $lasterror = ""; // 最后一次出错信息
  17. var $allowtype = array('gif', 'jpg', 'png', 'zip', 'rar', 'txt', 'doc', 'pdf');
  18. var $endfilename = ""; // 最终保存的文件名
  19. var $saveinfo = array(); // 保存文件的最终信息
  20. var $root_dir = ""; // 项目在硬盘上的位置
  21. /**
  22. * 构造函数
  23. * @access public
  24. */
  25. function uploadfile($arrfile, $path="_", $size = 2097152, $type = 0) {
  26. $this->postfile = $arrfile;
  27. $this->custompath = $path == "_" ? "" : $path ;
  28. $this->maxsize = $size;
  29. if($type!=0) $this->allowtype = $arrfile;
  30. $this->root_dir = $_server['document_root'];
  31. $this->_mkdir($this->custompath);
  32. }
  33. /**
  34. * 文件上传的核心代码
  35. * @access public
  36. * @return int 上传成功文件数
  37. */
  38. function upload() {
  39. $ilen = sizeof($this->postfile['name']);
  40. for($i=0;$i<$ilen;$i++){
  41. if ($this->postfile['error'][$i] == 0) { //上传时没有发生错误
  42. //取当前文件名、临时文件名、大小、扩展名,后面将用到。
  43. $sname = $this->postfile['name'][$i];
  44. $stname = $this->postfile['tmp_name'][$i];
  45. $isize = $this->postfile['size'][$i];
  46. $stype = $this->postfile['type'][$i];
  47. $sextn = $this->_getextname($sname);
  48. //开源代码phpfensi.com
  49. //检测当前上传文件大小是否合法。
  50. if($this->_checksize){
  51. $this->lasterror = "您上传的文件[".$sname."],超过系统支持大小!";
  52. $this->_showmsg($this->lasterror);
  53. continue;
  54. }
  55. if(!is_uploaded_file($stname)) {
  56. $this->lasterror = "您的文件不是通过正常途径上传!";
  57. $this->_showmsg($this->lasterror);
  58. continue;
  59. }
  60. $_filename = basename($sname,".".$sextn)."_".time().".".$sextn;
  61. $this->endfilename = $this->custompath.$_filename;
  62. if(!move_uploaded_file($stname, $this->root_dir.$this->endfilename)) {
  63. $this->lasterror = $this->postfile['error'][$i];
  64. $this->_showmsg($this->lasterror);
  65. continue;
  66. }
  67. //存储当前文件的有关信息,以便其它程序调用。
  68. $this->save_info[] = array("name" => $sname, "type" => $sextn, "size" => $isize, "path" => $this->endfilename);
  69. }
  70. }
  71. return sizeof($this->save_info);
  72. }
  1. /**
  2. * 得到上传信息
  3. * @access public
  4. * @return array 保存信息
  5. */
  6. function getsaveinfo(){
  7. return $this->save_info;
  8. }
  9. /**
  10. * 得到文件名的扩展名
  11. * @access private
  12. * @return string 返回文件扩展名
  13. */
  14. private function _getextname($filename){
  15. $arrparts = pathinfo($filename);
  16. return $arrparts['extension'];
  17. }
  18. /**
  19. * 判断文件大小
  20. * @access private
  21. * @return boolean 传入size大于系统定义,则true,反之false
  22. */
  23. private function _checksize($size){
  24. return $size > $this->maxsize;
  25. }
  26. /**
  27. * 输出错误信息
  28. * @access private
  29. * @return void
  30. */
  31. private function _showmsg($msg){
  32. printf("<b><错误信息:></b> %s <br>n", $msg);
  33. }
  34. /**
  35. * 新增多级目录
  36. * @access private
  37. * @return void
  38. */
  39. private function _mkdir($p){
  40. $ap = split('[/]', $p);
  41. foreach($ap as $v){
  42. if(!emptyempty($v)){
  43. if(emptyempty($path)) $path=$v;
  44. else $path.='/'.$v;
  45. file_exists($this->root_dir."/".$path) or mkdir($this->root_dir."/".$path);
  46. }
  47. }
  48. }
  49. }
  50. /*
  51. }
  52. /**//*
  53. //注意,上传组件name属性不管是一个还是多个都要使用数组形式,如:
  54. <input type="file" name="user_upload_file[]">
  55. <input type="file" name="user_upload_file[]">
  56. //如果用户点击了上传按钮。
  57. if ($_post['action'] == "上传") {
  58. //设置允许用户上传的文件类型。
  59. $type = array('gif', 'jpg', 'png', 'zip', 'rar');
  60. //实例化上传类,第一个参数为用户上传的文件组、第二个参数为存储路径、
  61. //第三个参数为文件最大大小。如果不填则默认为2m
  62. //第四个参数为充许用户上传的类型数组。如果不填则默认为gif, jpg, png, zip, rar, txt, doc, pdf
  63. $upload = new uploadfile($_files['user_upload_file'], 'j:/tmp', 100000, $type);
  64. //上传用户文件,返回int值,为上传成功的文件个数。
  65. $num = $upload->upload();
  66. if ($num != 0) {
  67. echo "上传成功<br>";
  68. //取得文件的有关信息,文件名、类型、大小、路径。用print_r()打印出来。
  69. print_r($upload->getsaveinfo());
  70. echo $num."个文件上传成功";
  71. }
  72. else {
  73. echo "上传失败<br>";
  74. }
  75. }
  76. * @(#)uploadfile.php
  77. *
  78. * 可同时处理用户多个上传文件。效验文件有效性后存储至指定目录。
  79. * 可返回上传文件的相关有用信息供其它程序使用。(如文件名、类型、大小、保存路径)
  80. * 使用方法请见本类底部(uploadfile类使用注释)信息。
  81. *
  82. */
  83. class uploadfile {
  84. var $user_post_file = array(); //用户上传的文件
  85. var $save_file_path; //存放用户上传文件的路径
  86. var $max_file_size; //文件最大尺寸
  87. var $last_error; //记录最后一次出错信息
  88. //默认允许用户上传的文件类型
  89. var $allow_type = array('gif', 'jpg', 'png', 'zip', 'rar', 'txt', 'doc', 'pdf');
  90. var $final_file_path; //最终保存的文件名
  91. var $save_info = array(); //返回一组有用信息,用于提示用户。
  92. /**//**
  93. * 构造函数,用与初始化相关信息,用户待上传文件、存储路径等
  94. *
  95. * @param array $file 用户上传的文件
  96. * @param string $path 存储用户上传文件的路径
  97. * @param integer $size 允许用户上传文件的大小(字节)
  98. * @param array $type 此数组中存放允计用户上传的文件类型
  99. */
  100. function uploadfile($file, $path, $size = 2097152, $type = '') {
  101. $this->user_post_file = $file;
  102. $this->save_file_path = $path;
  103. $this->max_file_size = $size; //如果用户不填写文件大小,则默认为2m.
  104. if ($type != '')
  105. $this->allow_type = $type;
  106. }
  107. /**//**
  108. * 存储用户上传文件,检验合法性通过后,存储至指定位置。
  109. * @access public
  110. * @return int 值为0时上传失败,非0表示上传成功的个数。
  111. */
  112. function upload() {
  113. for ($i = 0; $i < count($this->user_post_file['name']); $i++) {
  114. //如果当前文件上传功能,则执行下一步。
  115. if ($this->user_post_file['error'][$i] == 0) {
  116. //取当前文件名、临时文件名、大小、扩展名,后面将用到。
  117. $name = $this->user_post_file['name'][$i];
  118. $tmpname = $this->user_post_file['tmp_name'][$i];
  119. $size = $this->user_post_file['size'][$i];
  120. $mime_type = $this->user_post_file['type'][$i];
  121. $type = $this->getfileext($this->user_post_file['name'][$i]);
  122. //检测当前上传文件大小是否合法。
  123. if (!$this->checksize($size)) {
  124. $this->last_error = "the file size is too big. file name is: ".$name;
  125. $this->halt($this->last_error);
  126. continue;
  127. }
  128. //检测当前上传文件扩展名是否合法。
  129. if (!$this->checktype($type)) {
  130. $this->last_error = "unallowable file type: .".$type." file name is: ".$name;
  131. $this->halt($this->last_error);
  132. continue;
  133. }
  134. //检测当前上传文件是否非法提交。
  135. if(!is_uploaded_file($tmpname)) {
  136. $this->last_error = "invalid post file method. file name is: ".$name;
  137. $this->halt($this->last_error);
  138. continue;
  139. }
  140. //移动文件后,重命名文件用。
  141. $basename = $this->getbasename($name, ".".$type);
  142. //移动后的文件名
  143. $saveas = $basename."-".time().".".$type;
  144. //组合新文件名再存到指定目录下,格式:存储路径 + 文件名 + 时间 + 扩展名
  145. $this->final_file_path = $this->save_file_path."/".$saveas;
  146. if(!move_uploaded_file($tmpname, $this->final_file_path)) {
  147. $this->last_error = $this->user_post_file['error'][$i];
  148. $this->halt($this->last_error);
  149. continue;
  150. }
  151. //存储当前文件的有关信息,以便其它程序调用。
  152. $this->save_info[] = array("name" => $name, "type" => $type,
  153. "mime_type" => $mime_type,
  154. "size" => $size, "saveas" => $saveas,
  155. "path" => $this->final_file_path);
  156. }
  157. }
  158. return count($this->save_info); //返回上传成功的文件数目
  159. }
  160. /**//**
  161. * 返回一些有用的信息,以便用于其它地方。
  162. * @access public
  163. * @return array 返回最终保存的路径
  164. */
  165. function getsaveinfo() {
  166. return $this->save_info;
  167. }
  168. /**//**
  169. * 检测用户提交文件大小是否合法
  170. * @param integer $size 用户上传文件的大小
  171. * @access private
  172. * @return boolean 如果为true说明大小合法,反之不合法
  173. */
  174. function checksize($size) {
  175. if ($size > $this->max_file_size) {
  176. return false;
  177. }
  178. else {
  179. return true;
  180. }
  181. }
  182. /**//**
  183. * 检测用户提交文件类型是否合法
  184. * @access private
  185. * @return boolean 如果为true说明类型合法,反之不合法
  186. */
  187. function checktype($extension) {
  188. foreach ($this->allow_type as $type) {
  189. if (strcasecmp($extension , $type) == 0)
  190. return true;
  191. }
  192. return false;
  193. }
  194. /**//**
  195. * 显示出错信息
  196. * @param $msg 要显示的出错信息
  197. * @access private
  198. */
  199. function halt($msg) {
  200. printf("<b><uploadfile error:></b> %s <br>n", $msg);
  201. }
  202. /**//**
  203. * 取文件扩展名
  204. * @param string $filename 给定要取扩展名的文件
  205. * @access private
  206. * @return string 返回给定文件扩展名
  207. */
  208. function getfileext($filename) {
  209. $stuff = pathinfo($filename);
  210. return $stuff['extension'];
  211. }
  212. /**//**
  213. * 取给定文件文件名,不包括扩展名。
  214. * eg: getbasename("j:/hexuzhong.jpg"); //返回 hexuzhong
  215. *
  216. * @param string $filename 给定要取文件名的文件
  217. * @access private
  218. * @return string 返回文件名
  219. */
  220. function getbasename($filename, $type) {
  221. $basename = basename($filename, $type);
  222. return $basename;
  223. }
  224. }
  225. /**//******************** uploadfile类使用注释
  226. */
  227. ?>

一个简单实例,代码如下:

  1. <form enctype="multipart/form-data" action="up.php" method="post">
  2. send this file: <input name="userfile[]" type="file" /><br>
  3. send this file: <input name="userfile[]" type="file" /><br>
  4. send this file: <input name="userfile[]" type="file" /><br>
  5. <input type="submit" value="send file" />
  6. </form>
  7. <?php
  8. // in php versions earlier than 4.1.0, $http_post_files should be used instead
  9. // of $_files.
  10. $uploaddir = './';
  11. /*
  12. print "<pre>";
  13. if (move_uploaded_file($_files['userfile']['tmp_name'], $uploadfile)) {
  14. print "file is valid, and was successfully uploaded. ";
  15. print "here's some more debugging info:n";
  16. print_r($_files);
  17. } else {
  18. print "possible file upload attack! here's some debugging info:n";
  19. print_r($_files);
  20. }
  21. print "</pre>";
  22. */
  23. ?>
  24. <?php
  25. function rearrayfiles(&$file_post) {
  26. $file_ary = array();
  27. $file_count = count($file_post['name']);
  28. $file_keys = array_keys($file_post);
  29. for ($i=0; $i<$file_count; $i++) {
  30. foreach ($file_keys as $key) {
  31. $file_ary[$i][$key] = $file_post[$key][$i];
  32. }
  33. }
  34. return $file_ary;
  35. }
  36. print "<pre>";
  37. if ($_files['userfile']) {
  38. $file_ary = rearrayfiles($_files['userfile']);