非常经典的PHP文件上传类分享

这篇文章主要为大家详细介绍了一个经典的PHP文件上传类,降低功能的编写难度,也为了能节省开发时间,通常我们都会将这些反复使用的一段代码封装到一个类中,本文为大家分享了PHP文件上传类,需要的朋友可以参考下。

文件上传是项目开发中比较常见的功能,但文件上传的过程比较繁琐,只要是有文件上传的地方就需要编写这些复杂的代码。为了能在每次开发中降低功能的编写难度,也为了能节省开发时间,通常我们都会将这些反复使用的一段代码封装到一个类中。

  1. <?php
  2. /**
  3. +-----------------------------------------------------------------------------
  4. * 文件上传类
  5. +-----------------------------------------------------------------------------
  6. * @author Administrator
  7. +-----------------------------------------------------------------------------
  8. */
  9. class FileUpload{
  10. private $filepath; //保存路径
  11. private $allowtype=array('gif','jpg','jpeg','png','txt');
  12. private $maxsize=1000000; //最大允许上传大小
  13. private $israndname=true; //是否随机
  14. private $orginame; //原始文件名
  15. private $tmpname; //临时文件名
  16. private $newname; //新文件名
  17. private $filetype; //文件类型
  18. private $filesize; //文件大小
  19. private $errornum=''; //错误号
  20. private $errormsg; //错误信息
  21. /**
  22. +------------------------------------------------------------------------------
  23. *构造函数
  24. +------------------------------------------------------------------------------
  25. * @param string $savepath 保存路径
  26. * @param string $allowtype 允许类型
  27. * @param string $maxsize 允许大小
  28. *
  29. +------------------------------------------------------------------------------
  30. */
  31. function __construct($option=array()){
  32. foreach ($option as $key=>$value){
  33. if (!in_array($key,get_class_vars(get_class($this)))){
  34. continue;
  35. }
  36. $this->setOption($key, $value);
  37. }
  38. }
  39. function uploadfile($field) {
  40. $return=true;
  41. if (!$this->CheckPath()) {
  42. $this->errormsg=$this->geterrorNum();
  43. return false;
  44. }
  45. $name=$_FILES[$field]['name'];
  46. $tmpname=$_FILES[$field]['tmp_name'];
  47. $filesize=$_FILES[$field]['size'];
  48. $error=$_FILES[$field]['error'];
  49. if (is_array($name)) {
  50. $errors=array();
  51. for ($i=0;$i<count($name);$i++){
  52. if ($this->getFile($name[$i],$tmpname[$i],$filesize[$i],$errors[$i])) {
  53. if (!$this->CheckSize() && !$this->CheckType()) {
  54. $errors=$this->getErrorNum();
  55. return false;
  56. }
  57. }else{
  58. $errors=$this->getErrorNum();
  59. return false;
  60. }
  61. if (!$return) {
  62. $this->getFile();
  63. }
  64. }
  65. if ($return) {
  66. $fileNames=array();
  67. for ($i=0;$i<count($name);$i++){
  68. if ($this->getFile($name[$i], $tmpname[$i], $filesize[$i], $filesize[$i])) {
  69. $this->SetFileName();
  70. if (!$this->MoveFile()) {
  71. $errors[]=$this->getErrorNum();
  72. $return=false;
  73. }else{
  74. $fileNames[]=$this->getNewName();
  75. }
  76. }
  77. }
  78. $this->newname=$fileNames;
  79. }
  80. $this->errormsg=$errors;
  81. return $return;
  82. }else{
  83. if($this->getFile($name,$tmpname,filesize,$error)){
  84. if(!$this->CheckSize()){
  85. return false;
  86. }
  87. if(!$this->CheckType()){
  88. return false;
  89. }
  90. $this->SetFileName();
  91. if ($this->MoveFile()) {
  92. return true;
  93. }
  94. }else{
  95. return false;
  96. }
  97. if (!$return) {
  98. $this->setOption('ErrorNum', 0);
  99. $this->errormsg=$this->geterrorNum();
  100. }
  101. return $return;
  102. }
  103. }
  104. /**
  105. +------------------------------------------------------------------------
  106. *设置类属性值函数
  107. +------------------------------------------------------------------------
  108. * @param mix $key
  109. * @param mix $value
  110. */
  111. private function setOption($key,$value){
  112. $key=strtolower($key);
  113. $this->$key=$value;
  114. }
  115. /**
  116. +---------------------------------------------------------------------------
  117. * 获取文件变量参数函数
  118. +---------------------------------------------------------------------------
  119. * @param string $name
  120. * @param string $tmp_name
  121. * @param number $size
  122. * @param number $error
  123. */
  124. private function getFile($name,$tmpname,$filetype,$filesize,$error=0){
  125. $this->setOption('TmpName', $tmpname);
  126. $this->setOption('OrgiName', $name);
  127. $arrstr=explode('.', $name);
  128. $this->setOption('FileType', $arrstr[count($arrstr)-1]);
  129. $this->setOption('FileSize', $filesize);
  130. return true;
  131. }
  132. /**
  133. +-------------------------------------------------------------------------
  134. * 检查上传路径函数
  135. +-------------------------------------------------------------------------
  136. * @return boolean
  137. */
  138. private function CheckPath(){
  139. if(emptyempty($this->filepath)){
  140. $this->setOption('ErrorNum', -5);
  141. return false;
  142. }
  143. if (!file_exists($this->filepath)||!is_writable($this->filepath)) {
  144. if (!@mkdir($this->filepath,0755)) {
  145. $this->setOption('ErrorNum',-4);
  146. return false;
  147. }
  148. }
  149. return true;
  150. }
  151. private function Is_Http_Post(){
  152. if (!is_uploaded_file($this->tmpname)) {
  153. $this->setOption('ErrorNum',-6);
  154. return false;
  155. }else{
  156. return true;
  157. }
  158. }
  159. /**
  160. +--------------------------------------------------------------------
  161. *检查文件尺寸函数
  162. +--------------------------------------------------------------------
  163. * @return boolean
  164. */
  165. private function CheckSize(){
  166. if ($this->filesize>$this->maxsize) {
  167. $this->setOption('ErrorNum', -2);
  168. return false;
  169. }else{
  170. return true;
  171. }
  172. }
  173. /**
  174. +---------------------------------------------------------------
  175. * 检查文件类型函数
  176. +---------------------------------------------------------------
  177. * @return boolean
  178. */
  179. private function CheckType(){
  180. if (in_array($this->filetype, $this->allowtype)) {
  181. return true;
  182. }else{
  183. $this->setOption('ErrorNum', -1);
  184. return false;
  185. }
  186. }
  187. private function SetFileName(){
  188. if ($this->israndname) {
  189. $this->setOption('NewName', $this->RandName());
  190. }else{
  191. $this->setOption('NewName',$this->orginame);
  192. }
  193. }
  194. /**
  195. +-----------------------------------------------------------------
  196. * 获取新文件名
  197. +------------------------------------------------------------------
  198. */
  199. public function getNewName() {
  200. return $this->newname;
  201. }
  202. private function RandName(){
  203. $rule=date("YmdHis").rand(0, 999);
  204. return $rule.'.'.$this->filetype;
  205. }
  206. private function MoveFile(){
  207. if ($this->errornum) {
  208. $filepath=rtrim($this->filaepath,'/').'/';
  209. $filepath.=$this->newname;
  210. if (@move_uploaded_file($this->tmpname,$filepath)) {
  211. return true;
  212. }else{
  213. $this->errormsg=$this->setOption('ErrorNum',-3 );
  214. }
  215. }else{
  216. return false;
  217. }
  218. }
  219. /**
  220. +----------------------------------------------------------------
  221. * 错误信息函数
  222. +----------------------------------------------------------------
  223. * @return string
  224. */
  225. function getErrorNum() {
  226. $erstr="上传文件<font color='red'>{$this->orginame}</font>出错";
  227. switch ($this->errornum) {
  228. case 4:
  229. $erstr.="没有文件被上传";
  230. break;
  231. case 3:
  232. $erstr.="文件只被部分上传";
  233. break;
  234. case 2:
  235. $erstr.="上传文件超过了HTML表单MAX_FILE_SIZE指定的值";
  236. break;
  237. case 1:
  238. $erstr.="上传文件超过了php.ini配置文件中upload_max_filesize的值";
  239. break;
  240. case 0:
  241. $erstr="上传{$this->orginame}成功";
  242. break;
  243. case -1:
  244. $erstr="未允许的类型";
  245. break;
  246. case -2:
  247. $erstr.="文件过大,不能超过{$this->maxsize}个字节";
  248. break;
  249. case -3:
  250. $erstr.="上传失败";
  251. break;
  252. case -4:
  253. $erstr="创建上传目录失败,请重新指定上传目录";
  254. break;
  255. case -5:
  256. $erstr="未指定上传路径";
  257. break;
  258. case -6:
  259. $erstr="非法操作";
  260. break;
  261. default:
  262. $erstr.="未知错误";
  263. }
  264. return $erstr;
  265. }
  266. }
  267. ?>

以上就是本文的全部内容,希望对大家学习php程序设计有所帮助。