/**

* 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相关推荐

  1. 上传问题总结(文件大小检测,大文件上传)

    PHP上传问题总结(文件大小检测,大文件上传) 由于涉及到本地和服务器两方面的安全问题,所以基于input type="file"形式的页面文件上传一直处于一个很尴尬的位置.一方面 ...

  2. 简单的html网页图片上传,10个有用的HTML文件上传技巧

    上传文件的能力是许多Web和移动应用的关键需求,从将照片上传到社交媒体上到将简历发布到工作门户网站上,文件上传无处不在. 作为一名Web开发人员,我们一定知道HTML提供了原生文件上传的支持,并借助于 ...

  3. ajaxfileupload 监听上传进度_一篇文章学会文件上传

    文件上传 文件上传原理 文件上传的原理,就是DOM中的FileUpload对象.就是这句 <input type="file"> 但仅仅这样并不足够. 文件上传本质上是 ...

  4. 原生Servlet文件上传和下载Servlet多个文件上传

    2019独角兽企业重金招聘Python工程师标准>>> 转载:原文连接https://blog.csdn.net/HaHa_Sir/article/details/81744629 ...

  5. 二阶段补充:文件上传服务端处理,后端文件上传、前端两种文件上传方式

    1.文件上传 2.后端文件上传 两种方案: 兼容性较好的commons-fileupload,支持所有版本的Servlet,即所有版本的Tomcat 优点: 兼容性 缺点 需要外部jar,比较麻烦.代 ...

  6. 文件在上传过程中发生异常服务器端,文件上传服务器端

    文件上传服务器端 内容精选 换一换 本节操作介绍本地Linux操作系统主机通过SCP向Linux云服务器传输文件的操作步骤.登录管理控制台,在ECS列表页面记录待上传文件的云服务器的弹性公网IP.上传 ...

  7. 再次分享一个多选文件上传方案“.NET研究”

    多选文件上传,已经非常多了,选择性多了可能有时候要比较下哪个更合适,结合到项目中使用更方便才是最重要的.很多的多选上传基本上都是调用的swf文件,确实用flash 或flex开发一个多选上传的功能很方 ...

  8. 实现一个简单的文件上传进度条

    新手入门web 文件上传完成 取得的进展 没有进度条只能用文字 不好看  必须是一个进度条  没有艺术 互联网很 进度条 需要图片 有多种帧的 他看上去好麻烦 让自己的单纯 很简单 我没想到这么复杂 ...

  9. 再次分享一个多选文件上传方案

    多选文件上传,已经非常多了,选择性多了可能有时候要比较下哪个更合适,结合到项目中使用更方便才是最重要的.很多的多选上传基本上都是调用的swf文件,确实用flash 或flex开发一个多选上传的功能很方 ...

  10. ie6多文件上传_一个好的“文件上传”功能必须要注意的这些点你都知道吗?

    检查上传文件扩展名白名单,不属于白名单内,不允许上传:[前端和后端都要做好校验] 上传文件的目录必须是http请求无法直接访问到的.如果需要访问的,必须上传到其他(和web服务器不同的)域名下,并设置 ...

最新文章

  1. Visual Studio UML Use Case Diagram(1)
  2. 数据库名、实例名、数据库域名、全局数据库名、服务名,
  3. 佛山居住证办理(首次)
  4. AtomicLong和LongAdder的区别
  5. python的功能名称_ML获取功能选择后的功能名称SelectPercentile,python
  6. python画中秋的月亮_水彩中秋月亮教程
  7. tex中让公式和文字在一行_1行代码搞定LaTeX公式编写,这个4.6M的Python小插件,堪称论文必备神器...
  8. php按钮鼠标感应就变色,JavaScript_JS实现网页滚动条感应鼠标变色的方法,本文实例讲述了JS实现网页滚 - phpStudy...
  9. 2019118_四个化学数据分析(3)
  10. java俄罗斯方块说明书_俄罗斯方块java代码(java编写俄罗斯方块代码详解)
  11. 【Web技术】771- 图片懒加载从简单到复杂
  12. 【ecshop二次开发】ecshop截取中文字符串的方法
  13. 所以为什么要学ps?
  14. nvidia agx xavier平台imx334 驱动调试记录
  15. 如何控制input的输入方向
  16. 【嵌入式学习】嵌入式开发的第一课
  17. 如何隐藏html路径,怎么显示隐藏文件夹
  18. 机器学习入门三剑客之Matplotlib
  19. 牛客算法周周练14 BCircle D 绝地求生(gcd,思维) E
  20. Duilib简明教程

热门文章

  1. IADS Revision Note 1: Asymptotic Notations
  2. unity使用Curvy随机选择路线
  3. c语言题库-礼炮声响次数,c语言题库与答案精华版资料.doc
  4. 图说报告 | “智能+”的终极版图:数字孪生世界
  5. 使用burp对Tomcat 弱密码爆破
  6. js实现全国省份下拉
  7. python中常见函数总结
  8. api读取注册表键值
  9. Word宏与VBA/VB
  10. paraview视图vtkView