面向对象中的文件上传类

<?php
/**
*文件上传类
*
**/

class Upload
{
	//上传到哪个目录
	protected $path = ‘./upload/‘;
	//准许的MIME
	protected $allowmime = [‘image/png‘,‘image/jpg‘,‘image/jpeg‘,‘image/pjpeg‘,‘image/bmp‘,‘image/wbmp‘,‘image/gif‘,‘image/x-png‘];
	//准许的后缀
	protected $allowsubfix = [‘jpg‘,‘png‘,‘jpeg‘,‘gif‘,‘bmp‘];
	//准许的大小
	protected $allowsize = 2097152;
	//是否准许随机文件名
	protected $israndname = true;
	//是否准许日期目录
	protected $isdatepath = true;
	//文件的大小
	protected $size;
	//文件的原名
	protected $orgname;
	//文件的新名
	protected $newname;
	//文件的后缀
	protected $subfix;
	//文件的MIME类型
	protected $mime;
	//文件的新路径
	protected $newpath;
	//错误号
	protected $errorno;
	//错误信息
	protected $errorinfo;
	//临时文件
	protected $tmpfile;
	//前缀
	protected $prefix;

	//初使化成员属性,传进来的东西特别多,我们要求以数组的形式来传递
	//foreach循环,取出键名、值
	//将键名设置为成员属性名,将键值设为成员属性值
	//注意键名的合法性
	// errorInfo   errorinfo
	public function __construct(Array $config = [])
	{
		foreach ($config as $key => $value) {
			$this->setOption($key,$value);
		}

	}

	protected function setOption($key,$value)
	{
		$key = strtolower($key);

		$allPro = get_class_vars(get_class($this));

		if (array_key_exists($key,$allPro)) {
			$this->$key = $value;
		}
	}

	//设置一个get方法专门获得新路径

	//设置 一个get方法专门来获得错误信息

	//成员方法上传方法
	public function uploadFile($field)
	{

		//检测路径用户是否定义过,如果没有定义失败
		if (!file_exists($this->path)) {
			$this->setOption(‘errorNo‘,-1);
			return false;
		}

		//目录权限检测
		if (!$this->checkPath()) {
			$this->setOption(‘errorNo‘,-2);
			return false;

		}

		//获得$_FILES当中五个基本信息
		$name = $_FILES[$field][‘name‘];
		$size = $_FILES[$field][‘size‘];
		$type = $_FILES[$field][‘type‘];
		$tmpName = $_FILES[$field][‘tmp_name‘];
		$error = $_FILES[$field][‘error‘];

		//传入到一个成员方法里面进行设置
		if (!$this->setFiles($name,$size,$type,$tmpName,$error)) {
			return false;
		}

		//检测MIME是否合法,检测后缀是否合法,检测文件大小是否超过了自定义的大小
		if (!$this->checkMime() || !$this->checkSubfix() || !$this->checkSize()) {
			return false;
		}

		//新名
		$this->newname = $this->getNewName();

		//新路径处理
		$this->newpath = $this->getNewPath();

		//是否是上传文件
		//如果是上传文件移动上传文件至指定的目录
		//如果成员return true
		return $this->move();

	}

	protected function move()
	{
		if (!is_uploaded_file($this->tmpfile)) {
			$this->setOption(‘errorNo‘,-6);
			return false;
		}

		if (move_uploaded_file($this->tmpfile,$this->newpath.$this->newname)) {
			return true;
		} else {
			$this->setOption(‘errorNo‘,-7);
			return false;
		}

	}

	protected function getNewPath()
	{
		$this->path = rtrim($this->path,‘/‘).‘/‘;

		if ($this->isdatepath) {
			$newpath = $this->path.date(‘Y/m/d/‘);
			if (!file_exists($newpath)) {
				mkdir($newpath,0755,true);
			}
			return $newpath;
		} else {
			return $this->path;
		}

	}

	protected function getNewName()
	{
		if ($this->israndname) {
			return $this->prefix . uniqid() . ‘.‘ . $this->subfix;
		} else {
			return $this->prefix . $this->orgname;
		}
	}

	protected function checkSize()
	{
		if ($this->size > $this->allowsize) {

			$this->setOption(‘errorNo‘,-5);
			return false;
		} else {

			return true;
		}

	}

	protected function checkSubFix()
	{

		if (in_array($this->subfix,$this->allowsubfix)) {

			return true;
		} else {

			$this->setOption(‘errorNo‘,-4);
			return false;
		}
	}

	protected function checkMime()
	{
		if (in_array($this->mime,$this->allowmime)) {

			return true;
		} else {

			$this->setOption(‘errorNo‘,-3);
			return false;
		}

	}

	protected function setFiles($name,$size,$type,$tmpName,$error) {
		//1 2 3 4 6 7  0(正常)
		if ($error) {
			$this->setOption(‘errorNo‘,$error);
			return false;
		}

		$this->orgname = $name;
		$this->size = $size;
		$this->tmpfile = $tmpName;
		$this->mime = $type;

		//后缀没处理
		$info = pathinfo($name);
		$this->subfix = $info[‘extension‘];

		return true;
		/*
		$arr = explode(‘.‘,$name);
		$this->subfix = array_pop($arr);

		$arr = explode(‘.‘,$name);
		$this->subfix = $arr[count($arr)-1];

		$pos = strrpos($name,‘.‘);
		echo substr($name,$pos + 1);
		*/
	}

	protected function checkPath()
	{
		//检测路径是否是目录,如果不存在创建
		if (!is_dir($this->path)) {
			return mkdir($this->path,0755,true);
		}
		//检测路径是否可写,如果不写写更改权限
		if (!is_writeable($this->path) ||  !is_readable($this->path)) {
			return chmod($this->path,0755);
		}
		return true;
	}

	protected function getErrorInfo()
	{
		switch ($this->errorno) {
			case 1:
				$str = ‘上传的文件超过了 php.ini 中 upload_max_filesize 选项限制的值‘;
				break;
			case 2:
				$str = ‘上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值‘;
				break;
			case 3:
				$str = ‘部份件被上传‘;
				break;
			case 4:
				$str = ‘没有文件被上传‘;
				break;
			case 6:
				$str = ‘找不到临时文件夹‘;
				break;
			case 7:
				$str = ‘临时文件写入失败‘;
				break;
			case -1:
				$str = ‘自定义的上传路径不存在‘;
				break;
			case -2:
				$str = ‘没有权限‘;
				break;
			case -3:
			case -4:
				$str = ‘类型或后缀不准许‘;
				break;
			case -5:
				$str = ‘超过了自定义的大小‘;
				break;
			case -6:
				$str = ‘不是上传文件‘;
				break;
			case -7:
				$str = ‘移动上传文件失败‘;
				break;

		}
		return $str;
	}

	public function __get($key)
	{
		if (in_array($key, [‘newpath‘,‘newname‘,‘errorno‘,‘size‘])) {
			return $this->$key;
		} else if ($key == ‘errorinfo‘) {
			return $this->getErrorInfo();
		}
	}
}

//调用:

$upload = new Upload();

$result = $upload->uploadFile(‘f‘);

var_dump($result);
时间: 2024-10-01 16:55:55

面向对象中的文件上传类的相关文章

ajax结合文件上传类进行多文件的单个上传

今天做项目的时候碰见一个问题:之前一个同事离职之前做了一个网站,有一个上传商品详细图片的功能,当时已经完成,但是由于后期程序的有更改以及更改的程序员的水平也是参差不齐,最后导致程序bug很多,由于当时用的是一个框架,最终也没找到说明文档,后来我就重新写了一个结合ajax上传文件的upload.classs.php虽然界面欠缺美观,但是通俗易懂好维护. //首先是页面. index.php <!DOCTYPE html> <html lang="en"> <

PHP文件上传类(页面和调用部分)

<!--upform.html内容--> <form action="upload.php" method="post" enctype="multipart/form-data" > name: <input type="text" name="username" value="" /><br> <input type="

在WebBrowser中通过模拟键盘鼠标操控网页中的文件上传控件

在WebBrowser中通过模拟键盘鼠标操控网页中的文件上传控件 引言 这两天沉迷了Google SketchUp,刚刚玩够,一时兴起,研究了一下WebBrowser. 我在<WebBrowser控件使用技巧分享>一文中曾谈到过"我现在可以通过WebBrowser实现对各种Html元素的操控,唯独无法控制Html的上传控件",出于安全原因,IE没有对上传控件提供操控支持,这使得我们没法像控制其他控件一样用简单的代码进行赋值. 比较实际的解决方案就是模拟操作了,下面我就将演示

文件上传类

<?php /** file: fileupload.class.php 文件上传类FileUpload 本类的实例对象用于处理上传文件,可以上传一个文件,也可同时处理多个文件上传 */ class FileUpload { private $path = "./uploads"; //上传文件保存的路径 private $allowtype = array('jpg','gif','png'); //设置限制上传文件的类型 private $maxsize = 1000000;

PHP文件上传类

<form action="upload.php" method="post" enctype="multipart/form-data" > name: <input type="text" name="username" value="" /><br> <input type="hidden" name="MAX

php 文件上传类

<?php /** file: fileupload.class.php 文件上传类FileUpload 本类的实例对象用于处理上传文件,可以上传一个文件,也可同时处理多个文件上传 */ class FileUpload { private $path = "./uploads"; //上传文件保存的路径 private $allowtype = array('jpg','gif','png'); //设置限制上传文件的类型 private $maxsize = 1000000;

struts2中的文件上传,文件下载

文件上传: Servlet中的文件上传回顾 前台页面 1.提交方式post 2.表单类型 multipart/form-data 3.input type=file 表单输入项 后台 apache提交的FileUpload组件 核心类: FileItemFactory    FileItem的工厂 ServletFileUpLoad    servlet中文件上传的核心类 FileItem  封装了上传表单文件项的信息 在servlet中文件上传处理起来比较麻烦. struts框架对文件上传组件

文件上传类,实现文件上传功能

/** *==================================================================  * upload.class.php 文件上传类,实现文件上传功能 * 2013年3月27日0:37:15 *================================================================== */ class Upload{    private $path;   //文件上传目录    privat

文件上传类代码(php例子)

这里是来自网络朋友的一个实现的文件上传类代码,我们详细的介绍了每个变量的用处,下面看看吧,有需要可以参考一下. 这里是来自网络朋友的一个实现的文件上传类代码,我们详细的介绍了每个变量的用处,下面看看吧,有需要可以参考一下. <?php教程 /**  * 文件上传类  */ class uploadFile { public $max_size = '1000000';//设置上传文件大小  public $file_name = 'date';//重命名方式代表以时间命名,其他则使用给予的名称