其实网上已经有很多这样的类了,不过出于练手的目的还是自己仿照着写了一个。

下面的代码放在一个名为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'都行。
好的,文件上传类就这样写好了。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# php
# 文件上传类
# 上传类
# PHP文件上传功能实现逻辑分析
# PHP文件上传利用的常见函数总结大全
# php文件上传原理与实现方法详解
# PHP文件上传小程序 适合初学者学习!
# php文件上传类的分享
# phar绕过phar与HALT实现文件上传功能
# 上传
# 上传文件
# 文件上传
# 放在
# 可为
# 几个
# 我在
# 好了
# 就像
# 有很多
# 我们可以
# 就行
# 要做
# 超出了
# 扩展名
# 还有一个
# 写了
# 在上面
# 有两种
# 第三个
相关文章:
Java解压缩zip - 解压缩多个文件或文件夹实例
北京企业网站设计制作公司,北京铁路集团官方网站?
如何通过FTP服务器快速搭建网站?
如何选择最佳自助建站系统?快速指南解析优劣
建站之星如何修改网站生成路径?
武汉网站如何制作,黄黄高铁武穴北站途经哪些村庄?
香港服务器租用费用高吗?如何避免常见误区?
C++如何将C风格字符串(char*)转换为std::string?(代码示例)
广州美橙建站如何快速搭建多端合一网站?
实例解析angularjs的filter过滤器
php条件判断怎么写_ifelse和switchcase的使用区别【对比】
胶州企业网站制作公司,青岛石头网络科技有限公司怎么样?
厦门模型网站设计制作公司,厦门航空飞机模型掉色怎么办?
如何挑选优质建站一级代理提升网站排名?
建站与域名管理如何高效结合?
rsync同步时出现rsync: failed to set times on “xxxx”: Operation not permitted
大连 网站制作,大连天途有线官网?
如何用免费手机建站系统零基础打造专业网站?
交易网站制作流程,我想开通一个网站,注册一个交易网址,需要那些手续?
如何快速生成高效建站系统源代码?
如何快速搭建安全的FTP站点?
网站制作价目表怎么做,珍爱网婚介费用多少?
大学网站设计制作软件有哪些,如何将网站制作成自己app?
MySQL查询结果复制到新表的方法(更新、插入)
免费视频制作网站,更新又快又好的免费电影网站?
建站主机空间推荐 高性价比配置与快速部署方案解析
如何用虚拟主机快速搭建网站?详细步骤解析
Bpmn 2.0的XML文件怎么画流程图
如何通过.red域名打造高辨识度品牌网站?
潍坊网站制作公司有哪些,潍坊哪家招聘网站好?
Thinkphp 中 distinct 的用法解析
魔毅自助建站系统:模板定制与SEO优化一键生成指南
建站之星图片链接生成指南:自助建站与智能设计教程
在线流程图制作网站手机版,谁能推荐几个好的CG原画资源网站么?
佛山企业网站制作公司有哪些,沟通100网上服务官网?
建站之星代理平台如何选择最佳方案?
教程网站设计制作软件,怎么创建自己的一个网站?
小捣蛋自助建站系统:数据分析与安全设置双核驱动网站优化
威客平台建站流程解析:高效搭建教程与设计优化方案
山东云建站价格为何差异显著?
详解免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)
如何在阿里云服务器自主搭建网站?
网站制作软件免费下载安装,有哪些免费下载的软件网站?
建站IDE高效指南:快速搭建+SEO优化+自适应模板全解析
如何在阿里云虚拟机上搭建网站?步骤解析与避坑指南
网站制作培训多少钱一个月,网站优化seo培训课程有哪些?
香港服务器选型指南:免备案配置与高效建站方案解析
桂林网站制作公司有哪些,桂林马拉松怎么报名?
手机钓鱼网站怎么制作视频,怎样拦截钓鱼网站。怎么办?
建站主机是否等同于虚拟主机?
*请认真填写需求信息,我们会在24小时内与您取得联系。