一个完整的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之第八天
Oct 09 PHP
通过ODBC连接的SQL SERVER实例
Oct 09 PHP
php 转换字符串编码 iconv与mb_convert_encoding的区别说明
Nov 10 PHP
第二章 PHP入门基础之php代码写法
Dec 30 PHP
PHPMailer使用教程(PHPMailer发送邮件实例分析)
Dec 06 PHP
php调用新浪短链接API的方法
Nov 08 PHP
smarty模板判断数组为空的方法
Jun 10 PHP
PHP之密码加密的几种方式
Jul 29 PHP
php 生成Tab键或逗号分隔的CSV
Sep 24 PHP
PHP模型Model类封装数据库操作示例
Mar 14 PHP
Yii框架ACF(accessController)简单权限控制操作示例
Apr 26 PHP
解决PhpStorm64不能启动的问题
Jun 20 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数据缓存的使用说明
2013/05/10 PHP
PHP实现HTML页面静态化的方法
2015/11/04 PHP
php中通用的excel导出方法实例
2017/12/30 PHP
PHP Class SoapClient not found解决方法
2018/01/20 PHP
JQuery jsonp 使用示例代码
2009/08/12 Javascript
File, FileReader 和 Ajax 文件上传实例分析(php)
2011/04/27 Javascript
Node.js:Windows7下搭建的Node.js服务(来玩玩服务器端的javascript吧,这可不是前端js插件)
2011/06/27 Javascript
关于js中alert弹出窗口文本换行问题简单详细说明
2012/12/11 Javascript
javaScript 动态访问JSon元素示例代码
2013/08/30 Javascript
Jqgrid设置全选(选择)及获取选择行的值示例代码
2013/12/28 Javascript
巧用replace将文字表情替换为图片
2014/04/17 Javascript
利用AngularJs实现京东首页轮播图效果
2016/09/08 Javascript
js自定义QQ菜单效果
2017/01/10 Javascript
Vue开发中整合axios的文件整理
2017/04/29 Javascript
Javascript循环删除数组中元素的几种方法示例
2017/05/18 Javascript
微信小程序获取微信运动步数的实例代码
2017/07/20 Javascript
删除table表格行的实例讲解
2017/09/21 Javascript
Vue单页面应用保证F5强刷不清空数据的解决方案
2018/01/31 Javascript
vue导出html、word和pdf的实现代码
2018/07/31 Javascript
Nodejs中的JWT和Session的使用
2018/08/21 NodeJs
关于layui toolbar和template的结合使用方法
2019/09/19 Javascript
vue 实现input表单元素的disabled示例
2019/10/28 Javascript
深入理解redux之compose的具体应用
2020/01/12 Javascript
Python基础学习之常见的内建函数整理
2017/09/06 Python
详解Python3.6安装psutil模块和功能简介
2018/05/30 Python
Python3实现获取图片文字里中文的方法分析
2018/12/13 Python
PyQt5 QTable插入图片并动态更新的实例
2019/06/18 Python
django框架model orM使用字典作为参数,保存数据的方法分析
2019/06/24 Python
使用Python实现Wake On Lan远程开机功能
2020/01/22 Python
keras 使用Lambda 快速新建层 添加多个参数操作
2020/06/10 Python
python线性插值解析
2020/07/05 Python
CSS3 三维变形实现立体方块特效源码
2016/12/15 HTML / CSS
西班牙伏林航空公司:Vueling
2016/08/05 全球购物
市场营销专业个人自荐信格式
2013/09/21 职场文书
南京大屠杀观后感
2015/06/02 职场文书
致运动员赞词
2015/07/22 职场文书