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


Posted in PHP onOctober 27, 2015

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

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

<?php
define('NO_FILE', '不存在上传文件');
define('NOT_ALLOW_EXT', '文件类型不在允许范围内');
define('NOT_ALLOW_SIZE', '文件大小不在允许范围内');
define('HAS_THE_FILE', '该文件已经存在');
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;
    }
  }
}
/***使用方法与参数说明***/
/***
  第一个参数$dir 为上传文件存放的路径
   第二个参数为$_FILES 为你那个上传文件变量
   第三个参数允许文件大小 单位为MB
  第四个参数允许的文件类型 格式为jpg|png|gif
  第五个参数是否需要生成新的文件名
   第六个参数为返回的提示格式 0为直接提示上传正确 1则返回一个数组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();
?>

调用方法
代码如下   

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

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

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

PHP 相关文章推荐
处理php自动反斜杠的函数代码
Jan 05 PHP
PHPnow安装服务[apache_pn]失败的问题的解决方法
Sep 10 PHP
解析如何去掉CodeIgniter URL中的index.php
Jun 25 PHP
PHP系统命令函数使用分析
Jul 05 PHP
PHP定时任务延缓执行的实现
Oct 08 PHP
php中cookie实现二级域名可访问操作的方法
Nov 11 PHP
php使用cookie实现记住用户名和密码实现代码
Apr 27 PHP
一个简单至极的PHP缓存类代码
Oct 23 PHP
php求数组全排列,元素所有组合的方法
May 05 PHP
PHP共享内存使用与信号控制实例分析
May 09 PHP
php正则表达式使用方法整理集合
Jan 31 PHP
php swoft框架实例用法
Dec 22 PHP
php邮件发送的两种方式
Apr 28 #PHP
php语言中使用json的技巧及json的实现代码详解
Oct 27 #PHP
php+ajax实现无刷新的新闻留言系统
Dec 21 #PHP
PHP测试成功的邮件发送案例
Oct 26 #PHP
php使用APC实现实时上传进度条功能
Oct 26 #PHP
php需登录的文件上传管理系统
Mar 21 #PHP
PHP文件缓存类实现代码
Oct 26 #PHP
You might like
使用PHP数组实现无限分类,不使用数据库,不使用递归.
2006/12/09 PHP
PHP会话控制:Session与Cookie详解
2014/09/27 PHP
php使用Session和文件统计在线人数
2015/07/04 PHP
PHP实现多维数组转字符串和多维数组转一维数组的方法
2015/08/08 PHP
php关闭warning问题的解决方法
2016/05/17 PHP
PHP中大括号'{}'用法实例总结
2017/02/08 PHP
php魔法函数与魔法常量使用介绍
2017/07/23 PHP
Thinkphp5行为使用方法汇总
2017/12/21 PHP
javascript 兼容FF的onmouseenter和onmouseleave的代码
2008/07/19 Javascript
dess中一个简单的多路委托的实现
2010/07/20 Javascript
JS 对象属性相关(检查属性、枚举属性等)
2015/04/05 Javascript
javascript继承的六大模式小结
2015/04/13 Javascript
JavaScript控制网页层收起和展开效果的方法
2015/04/15 Javascript
JavaScript实现广告弹窗效果
2016/08/09 Javascript
Angular中支持SCSS的方法
2017/11/18 Javascript
基于vue.js 2.x的虚拟滚动条的示例代码
2018/01/23 Javascript
使用百度地图实现地图网格的示例
2018/02/06 Javascript
基于JS实现web端录音与播放功能
2019/04/17 Javascript
vue element 生成无线级左侧菜单的实现代码
2019/08/21 Javascript
vue自定义插件封装,实现简易的elementUi的Message和MessageBox的示例
2020/11/20 Vue.js
python计算两个数的百分比方法
2018/06/29 Python
python opencv鼠标事件实现画框圈定目标获取坐标信息
2020/04/18 Python
python图形用户接口实例详解
2019/12/16 Python
python如何求圆的面积
2020/07/01 Python
Python执行时间的几种计算方法
2020/07/31 Python
国际化的太阳镜及太阳镜配件零售商:Sunglass Hut
2016/07/26 全球购物
街头时尚在线:JESSICABUURMAN
2019/06/16 全球购物
全球速卖通俄罗斯站:AliExpress俄罗斯
2019/06/17 全球购物
美德好少年事迹材料
2014/01/19 职场文书
小学美术教学反思
2014/02/01 职场文书
老公给老婆的检讨书(精华篇)
2014/10/18 职场文书
客房部经理岗位职责
2015/02/02 职场文书
社会实践单位意见
2015/06/05 职场文书
高中英语教学反思范文
2016/03/02 职场文书
创业计划书介绍
2019/04/24 职场文书
MySQL如何构建数据表索引
2021/05/13 MySQL