一个非常实用的php文件上传类
时间:2019-03-30
本文章向大家介绍一个非常实用的php文件上传类,主要包括一个非常实用的php文件上传类使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
其实网上已经有很多这样的类了,不过出于练手的目的还是自己仿照着写了一个。
下面的代码放在一个名为UploadFile.class.php文件内
<?php /** * 文件上传 * author:师少兵 * email :beibeijing163@163.com * time :2012/12/09 */ class UploadFile{ private $max_size = '2000000'; //设置上传文件的大小,此为2M private $rand_name = true; //是否采用随机命名 private $allow_type = array(); //允许上传的文件扩展名 private $error = 0; //错误代号 private $msg = ''; //信息 private $new_name = ''; //上传后的文件名 private $save_path = ''; //文件保存路径 private $uploaded = ''; //路径.文件名 private $file = ''; //等待上传的文件 private $file_type = array(); //文件类型 private $file_ext = ''; //上传文件的扩展名 private $file_name = ''; //文件原名称 private $file_size = 0; //文件大小 private $file_tmp_name = ''; //文件临时名称 /** * 构造函数,初始化 * @param string $rand_name 是否随机命名 * @param string $save_path 文件保存路径 * @param string $allow_type 允许上传类型 $allow_type可为数组 array('jpg', 'jpeg', 'png', 'gif'); $allow_type可为字符串 'jpg|jpeg|png|gif';中间可用' ', ',', ';', '|'分割 */ public function __construct($rand_name=true, $save_path='./upload/', $allow_type=''){ $this->rand_name = $rand_name; $this->save_path = $save_path; $this->allow_type = $this->get_allow_type($allow_type); } /** * 上传文件 * 在上传文件前要做的工作 * (1) 获取文件所有信息 * (2) 判断上传文件是否合法 * (3) 设置文件存放路径 * (4) 是否重命名 * (5) 上传完成 * @param array $file 上传文件 * $file须包含$file['name'], $file['size'], $file['error'], $file['tmp_name'] */ public function upload_file($file){ //$this->file = $file; $this->file_name = $file['name']; $this->file_size = $file['size']; $this->error = $file['error']; $this->file_tmp_name = $file['tmp_name']; $this->ext = $this->get_file_type($this->file_name); switch($this->error){ case 0: $this->msg = ''; break; case 1: $this->msg = '超出了php.ini中文件大小'; break; case 2: $this->msg = '超出了MAX_FILE_SIZE的文件大小'; break; case 3: $this->msg = '文件被部分上传'; break; case 4: $this->msg = '没有文件上传'; break; case 5: $this->msg = '文件大小为0'; break; default: $this->msg = '上传失败'; break; } if($this->error==0 && is_uploaded_file($this->file_tmp_name)){ //检测文件类型 if(in_array($this->ext, $this->allow_type)==false){ $this->msg = '文件类型不正确'; return false; } //检测文件大小 if($this->file_size > $this->max_size){ $this->msg = '文件过大'; return false; } } $this->set_file_name(); $this->uploaded = $this->save_path.$this->new_name; if(move_uploaded_file($this->file_tmp_name, $this->uploaded)){ $this->msg = '文件上传成功'; return true; }else{ $this->msg = '文件上传失败'; return false; } } /** * 设置上传后的文件名 * 当前的毫秒数和原扩展名为新文件名 */ public function set_file_name(){ if($this->rand_name==true){ $a = explode(' ', microtime()); $t = $a[1].($a[0]*1000000); $this->new_name = $t.'.'.($this->ext); }else{ $this->new_name = $this->file_name; } } /** * 获取上传文件类型 * @param string $filename 目标文件 * @return string $ext 文件类型 */ public function get_file_type($filename){ $ext = pathinfo($filename, PATHINFO_EXTENSION); return $ext; } /** * 获取可上传文件的类型 */ public function get_allow_type($allow_type){ $s = array(); if(is_array($allow_type)){ foreach($allow_type as $value){ $s[] = $value; } }else{ $s = preg_split("/[\s,|;]+/", $allow_type); } return $s; } //获取错误信息 public function get_msg(){ return $this->msg; } } ?>
其实上面的代码中还有一个可以改进的地方,就是将那些以‘file_'开头的变量缩写为一个$file数组,这样感觉更好一些。
下面我们来测试一下上面的代码。我在一个名为upfile.php文件写测试代码,同时将UploadFile.class.php放在同一个路径下。
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>upfile</title> </head> <body> <?php require 'UploadFile.class.php'; if(isset($_POST['sf']) && $_POST['sf']=='sf'){ if ($_FILES["file"]["error"] > 0){ echo "Error: " . $_FILES["file"]["error"] . "<br />"; }else{ $file = $_FILES['file']; $upload = new UploadFile(true, './images/', array('jpg', 'jpeg', 'png')); $upload->upload_file($file); echo $upload->get_msg(); } }else{ ?> <form action="" method='post' enctype="multipart/form-data"> <input type="file" name="file" id="file" /> <input type="hidden" name="sf" value="sf"/> <input type="submit" value="上传" name="sub" /> </form> <?php } ?> </body> </html>
在上面的代码中,我们可以尝试修改第15行的参数,用来判断一下我们写的方法是否正确。
这3个参数的含义分别表示:是否使用系统命名、文件存放的路径(相对)、允许上传的文件类型。那么就试试修改这3个参数会发生什么样的变化:(1)把true改为false是否就可以使用它原来的名字了;(2)改下存放路径,看看能不能依然能够上传;(3)试试上传几个不允许的文件,看能不能禁止住,而且关键第三个参数有两种形式,一种是数组,就像示例中一样;还有一种是字符串,用分隔符隔开就行, 'jpg|jpeg|png|gif', 'jpg jpeg png gif', 'jpg,jpeg,png,gif'都行。
好的,文件上传类就这样写好了。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
- Docker系列教程05-容器常用命令
- 数据分析利器-NumPy
- 【LEETCODE】模拟面试-134-Gas Station
- Docker系列教程17-默认bridge网络中配置DNS
- Docker系列教程16-network命令
- 【LEETCODE】模拟面试-206. Reverse Linked List
- Eslint检测出的问题如何自动修复
- 【LEETCODE】模拟面试-215. Kth Largest Element in an Array
- Docker系列教程15-Docker容器网络
- 数据挖掘
- Docker系列教程14-Docker数据持久化
- Docker 学习系列二之基本管理
- Docker系列教程13-Docker可视化管理工具
- Ubuntu 16.04 安装VNC
- php概述
- php教程
- php环境搭建
- PHP书写格式
- php变量
- php常量
- PHP注释
- php数组
- php字符串 string
- PHP整型 integer
- PHP浮点型 float
- php布尔型
- php数据类型之数组
- php数据类型之对象
- php数据类型之null
- php数据类型之间的转换
- php运算符
- php表达式
- PHP循环控制
- PHP流程控制
- php函数
- php全局变量
- PHP魔术变量
- php命名空间
- php 日期
- PHP包含文件
- php文件
- PHP 文件上传
- php Cookies
- php Sessions
- php email
- php安全email
- php错误处理
- PHP异常处理
- php过滤器
- PHP 高级过滤器
- php json
- php 表单
- PHP MySQL 简介
- PHP 连接 MySQL
- php创建数据库
- php 创建表
- php mysq 插入数据
- PHP MySQL 插入多条数据
- PHP MySQL 预处理语句
- php mysql 读取数据
- php mysql where
- PHP MySQL Order By
- PHP MySQL Update
- PHP MySQL Delete
- php ODBC
- 进行JDBC操作时,连接参数的配置(附DBUtil工具类)
- JavaEE中,考勤(签到签退)功能的实现
- HTTP协议详解,浏览器和服务器交互过程详解
- 京东网页(动态)搭建,利用jquery实现
- 京东购物车(动态)网页搭建,利用JavaScript实现
- 你不知道的 TypeScript 泛型(万字长文,建议收藏)
- JavaScript中的函数、对象
- 京东购物车网页(静态)搭建
- MyBatis注解详解
- MyBatis完整环境搭建步骤
- JDBC常见操作总结
- Oracle数据中的序列、索引、视图、事务操作详解以及rowid 和 rownum的简单介绍
- Oracle子查询详解
- SQL92、SQL99中的多表连接查询区别
- Oracle中的分组查询与DML