一个完整的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 date函数参数详解
Nov 27 PHP
PHP小技巧搜集,每个PHPer都来露一手
Jan 02 PHP
PHP MYSQL乱码问题,使用SET NAMES utf8校正
Nov 30 PHP
解决FastCGI 进程超过了配置的活动超时时限的问题
Jul 03 PHP
通过dbi使用perl连接mysql数据库的方法
Apr 16 PHP
PHP实现的简单mock json脚本分享
Feb 10 PHP
经典PHP加密解密函数Authcode()修复版代码
Apr 05 PHP
php常用字符串String函数实例总结【转换,替换,计算,截取,加密】
Dec 07 PHP
PHP接口并发测试的方法(推荐)
Dec 15 PHP
laravel excel 上传文件保存到本地服务器功能
Nov 14 PHP
php设计模式之代理模式分析【星际争霸游戏案例】
Mar 23 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脚本[带参数]的方法
2010/01/22 PHP
php json_encode()函数返回json数据实例代码
2014/10/10 PHP
基于php实现的php代码加密解密类完整实例
2016/10/12 PHP
php微信开发之百度天气预报
2016/11/18 PHP
动态刷新 dorado树的js代码
2009/06/12 Javascript
JS Excel读取和写入操作(模板操作)实现代码
2010/04/11 Javascript
JavaScript生成GUID的多种算法小结
2013/08/18 Javascript
JavaScript使用setInterval()函数实现简单轮询操作的方法
2015/02/02 Javascript
jQuery固定元素插件scrolltofixed使用指南
2015/04/21 Javascript
通过jquery-ui中的sortable来实现拖拽排序的简单实例
2016/05/24 Javascript
AngularJS入门示例之Hello World详解
2017/01/04 Javascript
webpack 2的react开发配置实例代码
2017/07/28 Javascript
Form表单上传文件(type=&quot;file&quot;)的使用
2017/08/03 Javascript
ES6 javascript中Class类继承用法实例详解
2017/10/30 Javascript
Vue2 SSR渲染根据不同页面修改 meta
2017/11/20 Javascript
解决layui使用layui-icon出现默认图标的问题
2019/09/11 Javascript
安装多版本Vue-CLI的实现方法
2020/03/24 Javascript
Vue管理系统前端之组件拆分封装详解
2020/08/23 Javascript
使用js和canvas实现时钟效果
2020/09/08 Javascript
Vue3配置axios跨域实现过程解析
2020/11/25 Vue.js
[01:11:35]Liquid vs LGD 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
Python3模拟登录操作实例分析
2019/03/12 Python
使用pandas实现连续数据的离散化处理方式(分箱操作)
2019/11/22 Python
python3中使用__slots__限定实例属性操作分析
2020/02/14 Python
突破canvas语法限制 让他支持链式语法
2012/12/24 HTML / CSS
常用的HTML5列表标签
2017/06/20 HTML / CSS
HSRP的含义以及如何工作
2014/09/10 面试题
校园报刊亭的创业计划书
2014/01/02 职场文书
优秀应届本科生求职信
2014/07/19 职场文书
股指期货心得体会
2014/09/10 职场文书
2015毕业生实习工作总结
2014/12/12 职场文书
医院营销工作计划
2015/01/16 职场文书
小学中队委竞选稿
2015/11/20 职场文书
Python制作春联的示例代码
2022/01/22 Python
使用kubeadm命令行工具创建kubernetes集群
2022/03/31 Servers
Go语言编译原理之源码调试
2022/08/05 Golang