一个完整的php文件上传类实例讲解

这篇文章主要介绍了一个完整的php文件上传类实例,可以自定上传文件大小与上传文件类型及文件保存地址,需要的朋友可以参考下。

这个文件上传类可以自定上传文件大小与上传文件类型及文件保存地址,在使用过程中有一个问题就是如果是中文文件名进行上传就会出现乱码,所以大家解决办法就是把页面保存成uft8即可解决。

下面就是为大家分享的代码:

  1. <?php
  2. define('NO_FILE', '不存在上传文件');
  3. define('NOT_ALLOW_EXT', '文件类型不在允许范围内');
  4. define('NOT_ALLOW_SIZE', '文件大小不在允许范围内');
  5. define('HAS_THE_FILE', '该文件已经存在');
  6. define('UPLOAD_FAILED', '上传失败');
  7. define('UPLOAD_SUCCESS', '上传成功');
  8. class file_uploader
  9. {
  10. var $_file;
  11. var $_filesize;
  12. var $_fileext;
  13. var $_filedir;
  14. var $_filename;
  15. var $_filetmpname;
  16. var $allowsize;
  17. var $allowext;
  18. var $neednewname;
  19. var $newname;
  20. var $syslang;
  21. var $report;
  22. function ready($filedir = '', $file, $allowsize = '', $allowext = '', $neednewname = false, $report = 0){
  23. $this->_filedir = is_dir($filedir) ? $filedir : '';
  24. if(emptyempty($file) || !isset($file['size']) || $file['size'] == 0) $this->error(NO_FILE);
  25. $this->_filesize = $file['size'];
  26. $this->_filename = $file['name'];
  27. $this->_filetmpname = $file['tmp_name'];
  28. $this->allowsize = $allowsize;
  29. $this->allowext = $allowext;
  30. $this->neednewname = ($neednewname) ? true : false;
  31. $this->newname = '';
  32. $this->report = $report;
  33. }
  34. function do_upload(){
  35. if(!is_uploaded_file($this->_filetmpname)) $this->error(NO_FILE);
  36. if($this->chk_ext()){
  37. $this->error(NOT_ALLOW_EXT);
  38. return '';
  39. }
  40. if($this->chk_size()){
  41. $this->error(NOT_ALLOW_SIZE);
  42. return '';
  43. }
  44. if($this->neednewname) $this->newname = $this->generate_name().".".$this->get_fileext();
  45. if($this->chk_hasfile()){
  46. $this->error(HAS_THE_FILE);
  47. return '';
  48. }
  49. $filename = emptyempty($this->newname) ? @iconv('utf-8','gb2312',$this->_filename) : $this->newname;
  50. @chmod($this->_filedir.$filename, 0777);
  51. if(move_uploaded_file($this->_filetmpname, $this->_filedir.$filename)){
  52. return $this->result();
  53. }else{
  54. $this->error(UPLOAD_FAILED);
  55. return '';
  56. }
  57. }
  58. function chk_ext(){
  59. if(emptyempty($this->allowext) || in_array($this->get_fileext(), explode("|",$this->allowext))) return false;
  60. return true;
  61. }
  62. function chk_size(){
  63. if(emptyempty($this->allowsize) || get_filesize <= $this->allowsize*1024*1024) return false;
  64. return true;
  65. }
  66. function get_filesize(){
  67. return $this->_filesize;
  68. }
  69. function get_fileext(){
  70. return substr($this->_filename,strrpos($this->_filename,".")+1);
  71. }
  72. function generate_name(){
  73. return substr(md5(time()),26);
  74. }
  75. function chk_hasfile(){
  76. return is_file($this->_filedir.$this->_filename);
  77. }
  78. function error($tip){
  79. echo $tip;
  80. }
  81. function result(){
  82. if($this->report){
  83. $filename = emptyempty($this->newname) ? $this->_filename : $this->newname;
  84. $arr = array('filename' => $filename, 'filesize' => $this->_filesize, 'tip' => UPLOAD_SUCCESS);
  85. return $arr;
  86. }else{
  87. return UPLOAD_SUCCESS;
  88. }
  89. }
  90. }
  91. /***使用方法与参数说明***/
  92. /***
  93. 第一个参数$dir 为上传文件存放的路径
  94. 第二个参数为$_FILES 为你那个上传文件变量
  95. 第三个参数允许文件大小 单位为MB
  96. 第四个参数允许的文件类型 格式为jpg|png|gif
  97. 第五个参数是否需要生成新的文件名
  98. 第六个参数为返回的提示格式 0为直接提示上传正确 1则返回一个数组array('filename' => $filename, 'filesize' => $this->_filesize, 'tip' => UPLOAD_SUCCESS);
  99. ***/
  100. //require("类文件");
  101. //$u = new file_uploader;
  102. //$u->ready($dir, $_FILES['upload_file'], false, false, true, 0);
  103. //echo $u->do_upload();
  104. ?>

调用方法,代码如下

  1. $dir = 'upload/';
  2. require("upload_class.php");
  3. $u = new file_uploader;
  4. $u->ready($dir, $_FILES['upload_file'], false, false, true, 0);
  5. echo $u->do_upload();

补充说明:在编码上面还是有些问题,自己是在utf8的页面将数据进行提交的,所以生成的文件如果保持原来的中文名字的话在文件夹中看到就是乱码的名字,如果不想出现乱码的话需要进行一下编码的转换。