一個(gè)完整的php文件上傳類實(shí)例講解
這個(gè)文件上傳類可以自定上傳文件大小與上傳文件類型及文件保存地址,在使用過(guò)程中有一個(gè)問(wèn)題就是如果是中文文件名進(jìn)行上傳就會(huì)出現(xiàn)亂碼,所以大家解決辦法就是把頁(yè)面保存成uft8即可解決。
下面就是為大家分享的代碼:
<?php define('NO_FILE', '不存在上傳文件'); define('NOT_ALLOW_EXT', '文件類型不在允許范圍內(nèi)'); define('NOT_ALLOW_SIZE', '文件大小不在允許范圍內(nèi)'); define('HAS_THE_FILE', '該文件已經(jīng)存在'); define('UPLOAD_FAILED', '上傳失敗'); define('UPLOAD_SUCCESS', '上傳成功'); class file_uploader { var $_file; var $_filesize; var $_fileext; var $_filedir; var $_filename; var $_filetmpname; var $allowsize; var $allowext; var $neednewname; var $newname; var $syslang; var $report; function ready($filedir = '', $file, $allowsize = '', $allowext = '', $neednewname = false, $report = 0){ $this->_filedir = is_dir($filedir) ? $filedir : ''; if(empty($file) || !isset($file['size']) || $file['size'] == 0) $this->error(NO_FILE); $this->_filesize = $file['size']; $this->_filename = $file['name']; $this->_filetmpname = $file['tmp_name']; $this->allowsize = $allowsize; $this->allowext = $allowext; $this->neednewname = ($neednewname) ? true : false; $this->newname = ''; $this->report = $report; } function do_upload(){ if(!is_uploaded_file($this->_filetmpname)) $this->error(NO_FILE); if($this->chk_ext()){ $this->error(NOT_ALLOW_EXT); return ''; } if($this->chk_size()){ $this->error(NOT_ALLOW_SIZE); return ''; } if($this->neednewname) $this->newname = $this->generate_name().".".$this->get_fileext(); if($this->chk_hasfile()){ $this->error(HAS_THE_FILE); return ''; } $filename = empty($this->newname) ? @iconv('utf-8','gb2312',$this->_filename) : $this->newname; @chmod($this->_filedir.$filename, 0777); if(move_uploaded_file($this->_filetmpname, $this->_filedir.$filename)){ return $this->result(); }else{ $this->error(UPLOAD_FAILED); return ''; } } function chk_ext(){ if(empty($this->allowext) || in_array($this->get_fileext(), explode("|",$this->allowext))) return false; return true; } function chk_size(){ if(empty($this->allowsize) || get_filesize <= $this->allowsize*1024*1024) return false; return true; } function get_filesize(){ return $this->_filesize; } function get_fileext(){ return substr($this->_filename,strrpos($this->_filename,".")+1); } function generate_name(){ return substr(md5(time()),26); } function chk_hasfile(){ return is_file($this->_filedir.$this->_filename); } function error($tip){ echo $tip; } function result(){ if($this->report){ $filename = empty($this->newname) ? $this->_filename : $this->newname; $arr = array('filename' => $filename, 'filesize' => $this->_filesize, 'tip' => UPLOAD_SUCCESS); return $arr; }else{ return UPLOAD_SUCCESS; } } } /***使用方法與參數(shù)說(shuō)明***/ /*** 第一個(gè)參數(shù)$dir 為上傳文件存放的路徑 第二個(gè)參數(shù)為$_FILES 為你那個(gè)上傳文件變量 第三個(gè)參數(shù)允許文件大小 單位為MB 第四個(gè)參數(shù)允許的文件類型 格式為jpg|png|gif 第五個(gè)參數(shù)是否需要生成新的文件名 第六個(gè)參數(shù)為返回的提示格式 0為直接提示上傳正確 1則返回一個(gè)數(shù)組array('filename' => $filename, 'filesize' => $this->_filesize, 'tip' => UPLOAD_SUCCESS); ***/ //require("類文件"); //$u = new file_uploader; //$u->ready($dir, $_FILES['upload_file'], false, false, true, 0); //echo $u->do_upload(); ?>
調(diào)用方法
代碼如下
$dir = 'upload/'; require("upload_class.php"); $u = new file_uploader; $u->ready($dir, $_FILES['upload_file'], false, false, true, 0); echo $u->do_upload();
補(bǔ)充說(shuō)明:在編碼上面還是有些問(wèn)題,自己是在utf8的頁(yè)面將數(shù)據(jù)進(jìn)行提交的,所以生成的文件如果保持原來(lái)的中文名字的話在文件夾中看到就是亂碼的名字,如果不想出現(xiàn)亂碼的話需要進(jìn)行一下編碼的轉(zhuǎn)換。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助。
相關(guān)文章
PHP的文件操作與算法實(shí)現(xiàn)的面試題示例
這篇文章主要介紹了PHP的文件操作與算法實(shí)現(xiàn)的面試題示例,選擇了一些最具代表性和最基礎(chǔ)的題目進(jìn)行了歸納,需要的朋友可以參考下2015-08-08Yii2框架實(shí)現(xiàn)數(shù)據(jù)庫(kù)常用操作總結(jié)
本篇文章主要介紹了Yii2框架實(shí)現(xiàn)數(shù)據(jù)庫(kù)常用操作總結(jié),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-02-02PHP jQuery表單,帶驗(yàn)證具體實(shí)現(xiàn)方法
這篇文章主要介紹了PHP jQuery表單,帶驗(yàn)證具體實(shí)現(xiàn)方法,需要的朋友可以參考下2014-02-02使用PHP如何實(shí)現(xiàn)高效安全的ftp服務(wù)器(二)
這篇文章主要介紹了使用PHP如何實(shí)現(xiàn)高效安全的ftp服務(wù)器(二)的相關(guān)資料,需要的朋友可以參考下2015-12-12laravel實(shí)現(xiàn)批量更新多條記錄的方法示例
最近在使用Laravel,想批量插入近千條數(shù)據(jù),通過(guò)網(wǎng)上找到了相關(guān)的解決方法,所以下面這篇文章主要給大家介紹了關(guān)于laravel實(shí)現(xiàn)批量更新多條記錄的相關(guān)資料,文中給出了詳細(xì)的示例代碼,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2017-10-10thinkphp3.x連接mysql數(shù)據(jù)庫(kù)的方法(具體操作步驟)
這篇文章主要介紹了thinkphp3.x連接mysql數(shù)據(jù)庫(kù)的方法,詳細(xì)分析了thinkPHP3.x操作數(shù)據(jù)庫(kù)的具體步驟,包括慣例配置文件設(shè)置,sql語(yǔ)句創(chuàng)建表以及針對(duì)數(shù)據(jù)庫(kù)的數(shù)據(jù)插入操作等,需要的朋友可以參考下2016-05-05