一个完整的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
坏狼的PHP学习教程之第1天
Jun 15 PHP
php 接口类与抽象类的实际作用
Nov 26 PHP
PHP中strtotime函数使用方法分享
Jan 10 PHP
thinkphp控制器调度使用示例
Feb 24 PHP
如何修改yii2.0自带的user表为其它的表
Aug 01 PHP
PHP实现权限管理功能示例
Sep 22 PHP
PHP二维关联数组的遍历方式(实例讲解)
Oct 18 PHP
JSON PHP中,Json字符串反序列化成对象/数组的方法
May 31 PHP
PhpStorm的使用教程(本地运行PHP+远程开发+快捷键)
Mar 26 PHP
PHP 对象接口简单实现方法示例
Apr 13 PHP
PHP程序员简单的开展服务治理架构操作详解(三)
May 14 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实现简易聊天室应用代码
2015/09/23 PHP
PHP判断表达式中括号是否匹配的简单实例
2016/10/22 PHP
JS效率个人经验谈(8-15更新),加入range技巧
2007/01/09 Javascript
jQuery 表单验证扩展代码(一)
2010/10/11 Javascript
JSON.stringify 语法实例讲解
2012/03/14 Javascript
Javascript核心读书有感之表达式和运算符
2015/02/11 Javascript
全面解析Bootstrap图片轮播效果
2015/12/03 Javascript
浅谈js里面的InttoStr和StrtoInt
2016/06/14 Javascript
jQuery实现frame之间互通的方法
2017/06/26 jQuery
关于meta viewport中target-densitydpi属性详解(推荐)
2017/08/18 Javascript
Three.js中网格对象MESH的属性与方法详解
2017/09/27 Javascript
原生js+cookie实现购物车功能的方法分析
2017/12/21 Javascript
详解Node 定时器
2018/02/26 Javascript
react redux入门示例
2018/04/19 Javascript
Nodejs中的JWT和Session的使用
2018/08/21 NodeJs
Vue-CLI3.x 设置反向代理的方法
2018/12/06 Javascript
微信小程序API—获取定位的详解
2019/04/30 Javascript
vue实现歌手列表字母排序下拉滚动条侧栏排序实时更新
2019/05/14 Javascript
javascript绘制简单钟表效果
2020/04/07 Javascript
javascript单张多张图无缝滚动实例代码
2020/05/10 Javascript
vue element和nuxt的使用技巧分享
2021/01/14 Vue.js
[07:57]DOTA2热力大趴狂欢夜 广州站活动回顾
2013/11/27 DOTA
对于Python异常处理慎用“except:pass”建议
2015/04/02 Python
python中threading超线程用法实例分析
2015/05/16 Python
python requests 测试代理ip是否生效
2018/07/25 Python
Python3.4学习笔记之类型判断,异常处理,终止程序操作小结
2019/03/01 Python
Python minidom模块用法示例【DOM写入和解析XML】
2019/03/25 Python
python基于递归解决背包问题详解
2019/07/03 Python
appium+python自动化配置(adk、jdk、node.js)
2020/11/17 Python
Lands’ End官网:经典的美国生活方式品牌
2016/08/14 全球购物
孕妇内衣和胸罩:Cake Maternity
2018/07/16 全球购物
一些Solaris面试题
2013/03/22 面试题
幼儿园秋游感想
2014/03/12 职场文书
婚前保证书
2014/04/29 职场文书
教师节感想
2015/08/11 职场文书
HTML页面中使两个div并排显示的实现
2022/05/15 HTML / CSS