php upload 上传类,发布一个PHP的文件上传类——Uploader
/**
* File: Uploader.class.php
* License: GNU
*
* @link http://www.fanbin.name/
* @copyright 2007 Fanbin
* @author Fanbin
* @version 1.0
*/
class Uploader
{
private $name; //文件被上传之前的名称
private $size; //文件大小
private $tmp_name; //文件在临时目录中的名字
private $type; //文件的MIME类型,在此类中未使用
private $error; //上传错误信息编号
private $fileExt; //文件的扩展名
private $validExt = array(); //允许的扩展名
private $newName; //文件上传后的名称
private $maxSize; //允许的最大大小
private $upDir; //上传到的目录
private $allowOverride; //是否允许覆盖,默认不允许
private $timeStamp; //时间戳,用于定义目录名和时间名
/**
* 构造器
*
* @param string $fileInput 上传表单中file域的name属性
*/
public function __construct($fileInput)
{
$this->name = $_FILES[$fileInput]['name'];
$this->size = $_FILES[$fileInput]['size'];
$this->tmp_name = $_FILES[$fileInput]['tmp_name'];
$this->type = $_FILES[$fileInput]['type'];
$this->error = $_FILES[$fileInput]['error'];
$this->fileExt = strtolower(strrchr($this->name, '.'));
$this->timeStamp = time();
$randChar = "abcdefghijklmnopqrstuvwxyz-_";
$rndStr = '';
for($i = 0; $i <= 4; $i++)
{
$rndStr .= $randChar{rand(0,27)};
}
$this->newName = $this->timeStamp.'-'.$rndStr.$this->fileExt;
$this->maxSize = 2097152; //2M
$this->upDir = $_SERVER['DOCUMENT_ROOT'].'/upload/'.date('Y-m', $this->timeStamp);
$this->allowOverride = false;
}
/**
* 设定上传后的文件名
*
* @param string $newName
* @return boolean
*/
public function setNewName($newName='')
{
if($newName != '')
{
if (preg_match("/^[a-z0-9_-]*\.(.){1,5}$/i", $newName))
{
$this->newName = $newName;
return true;
}
else
{
$this->error = 5;
}
}
else
{
return false;
}
}
/**
* 设定允许的扩展名
*
* @param array $validExt
* @return boolean
*/
public function setValidExt($validExt)
{
if(is_array($validExt))
{
$this->validExt = $validExt;
return true;
}
else
{
return false;
}
}
/**
* 设定允许的最大文件大小值
*
* @param int $maxSize
* @return boolean
*/
public function setMaxSize($maxSize)
{
if(isset($maxSize) && is_int($maxSize))
{
$this->maxSize = $maxSize;
return true;
}
else
{
$this->error = 6;
return false;
}
}
/**
* 设定要上传到的文件路径,一般必须在类实例化后手工指定。
* 注意:此方法无论目录是否存在均返回True。目录的合法性在调用Upload方法时判断
*
* @param string $updir
* @return boolean
*/
public function setUpDir($updir)
{
$this->upDir = $updir;
return true;
}
/**
* 处理上传,成功返回True,失败False。
* 若上传失败,可以调用getErrorMsg()获取错误原因。
*
* @return boolean
*/
public function upload()
{
if(file_exists($this->upDir.'/'.$this->newName) && !$this->allowOverride)
{
$this->error = 11;
return false;
}
if($this->getErrorMsg())
{
return false;
}
if(is_uploaded_file($this->tmp_name))
{
if(!in_array($this->fileExt, $this->validExt))
{
$this->error = 7;
return false;
}
if($this->size > $this->maxSize)
{
$this->error = 2;
return false;
}
if (!is_dir($this->upDir))
{
umask(0);
if(!mkdir($this->upDir, 0777))
{
$this->error = 8;
return false;
}
}
if(!move_uploaded_file($this->tmp_name, $this->upDir.'/'.$this->newName))
{
$this->error = 9;
return false;
}
}
else
{
$this->error = 10;
return false;
}
return true;
}
/**
* 获取上传的文件名
*
* @return string
*/
public function getFileName()
{
return $this->newName;
}
/**
* 获取上传的文件大小
*
* @return long
*/
public function getFileSize()
{
return $this->size;
}
/**
* 获取上传文件的完整物理路径
*
* @return string
*/
public function getFilePath()
{
return $this->upDir.'/'.$this->newName;
}
/**
* 获取错误信息,如果上传成功(无错误),则返回false
*
* @return mixed
*/
public function getErrorMsg()
{
return $this->getErrorTxt($this->error);
}
/**
* 私有方法,按错误号获取相应的错误信息
*
* @param int $needle
* @return string
*/
private function getErrorTxt($needle)
{
$validExtStr = '';
foreach ($this->validExt as $validExt)
{
$validExtStr .= ' '.$validExt.' ';
}
$errorTxt[0] = False; //0: no Error.
$errorTxt[1] = 'Sorry,上传的文件大小超出了服务器设定的最大值。';
$errorTxt[2] = 'Sorry,文件超出了规定的大小,请确保您上传的文件不超过'.($this->maxSize/1024).'KB';
$errorTxt[3] = '很倒霉,网络不稳定,上传中断,文件未完全上传:(';
$errorTxt[4] = '您没有选择要上传的文件啊?';
$errorTxt[5] = '文件名只允许英文字母和数字以及_-';
$errorTxt[6] = '只能用数字设置文件的最大大小';
$errorTxt[7] = '晕,不好意思,我们只允许上传如下扩展名的文件:'.$validExtStr;
$errorTxt[8] = '指定的目录无法创建,文件上传失败';
$errorTxt[9] = '未知错误,文件未Move成功';
$errorTxt[10] = '未知错误,Is_Not_Uploaded_File';
$errorTxt[11] = '遇到了发生率极小的同名文件错误,虽然文件未能成功上传,依然恭喜您';
return $errorTxt[$needle];
}
}
?>
php upload 上传类,发布一个PHP的文件上传类——Uploader相关推荐
- 上传问题总结(文件大小检测,大文件上传)
PHP上传问题总结(文件大小检测,大文件上传) 由于涉及到本地和服务器两方面的安全问题,所以基于input type="file"形式的页面文件上传一直处于一个很尴尬的位置.一方面 ...
- 简单的html网页图片上传,10个有用的HTML文件上传技巧
上传文件的能力是许多Web和移动应用的关键需求,从将照片上传到社交媒体上到将简历发布到工作门户网站上,文件上传无处不在. 作为一名Web开发人员,我们一定知道HTML提供了原生文件上传的支持,并借助于 ...
- ajaxfileupload 监听上传进度_一篇文章学会文件上传
文件上传 文件上传原理 文件上传的原理,就是DOM中的FileUpload对象.就是这句 <input type="file"> 但仅仅这样并不足够. 文件上传本质上是 ...
- 原生Servlet文件上传和下载Servlet多个文件上传
2019独角兽企业重金招聘Python工程师标准>>> 转载:原文连接https://blog.csdn.net/HaHa_Sir/article/details/81744629 ...
- 二阶段补充:文件上传服务端处理,后端文件上传、前端两种文件上传方式
1.文件上传 2.后端文件上传 两种方案: 兼容性较好的commons-fileupload,支持所有版本的Servlet,即所有版本的Tomcat 优点: 兼容性 缺点 需要外部jar,比较麻烦.代 ...
- 文件在上传过程中发生异常服务器端,文件上传服务器端
文件上传服务器端 内容精选 换一换 本节操作介绍本地Linux操作系统主机通过SCP向Linux云服务器传输文件的操作步骤.登录管理控制台,在ECS列表页面记录待上传文件的云服务器的弹性公网IP.上传 ...
- 再次分享一个多选文件上传方案“.NET研究”
多选文件上传,已经非常多了,选择性多了可能有时候要比较下哪个更合适,结合到项目中使用更方便才是最重要的.很多的多选上传基本上都是调用的swf文件,确实用flash 或flex开发一个多选上传的功能很方 ...
- 实现一个简单的文件上传进度条
新手入门web 文件上传完成 取得的进展 没有进度条只能用文字 不好看 必须是一个进度条 没有艺术 互联网很 进度条 需要图片 有多种帧的 他看上去好麻烦 让自己的单纯 很简单 我没想到这么复杂 ...
- 再次分享一个多选文件上传方案
多选文件上传,已经非常多了,选择性多了可能有时候要比较下哪个更合适,结合到项目中使用更方便才是最重要的.很多的多选上传基本上都是调用的swf文件,确实用flash 或flex开发一个多选上传的功能很方 ...
- ie6多文件上传_一个好的“文件上传”功能必须要注意的这些点你都知道吗?
检查上传文件扩展名白名单,不属于白名单内,不允许上传:[前端和后端都要做好校验] 上传文件的目录必须是http请求无法直接访问到的.如果需要访问的,必须上传到其他(和web服务器不同的)域名下,并设置 ...
最新文章
- Visual Studio UML Use Case Diagram(1)
- 数据库名、实例名、数据库域名、全局数据库名、服务名,
- 佛山居住证办理(首次)
- AtomicLong和LongAdder的区别
- python的功能名称_ML获取功能选择后的功能名称SelectPercentile,python
- python画中秋的月亮_水彩中秋月亮教程
- tex中让公式和文字在一行_1行代码搞定LaTeX公式编写,这个4.6M的Python小插件,堪称论文必备神器...
- php按钮鼠标感应就变色,JavaScript_JS实现网页滚动条感应鼠标变色的方法,本文实例讲述了JS实现网页滚 - phpStudy...
- 2019118_四个化学数据分析(3)
- java俄罗斯方块说明书_俄罗斯方块java代码(java编写俄罗斯方块代码详解)
- 【Web技术】771- 图片懒加载从简单到复杂
- 【ecshop二次开发】ecshop截取中文字符串的方法
- 所以为什么要学ps?
- nvidia agx xavier平台imx334 驱动调试记录
- 如何控制input的输入方向
- 【嵌入式学习】嵌入式开发的第一课
- 如何隐藏html路径,怎么显示隐藏文件夹
- 机器学习入门三剑客之Matplotlib
- 牛客算法周周练14 BCircle D 绝地求生(gcd,思维) E
- Duilib简明教程