前言
  在php开发中,必不可少要用到文件上传,整理封装了一个图片上传的类也很有必要。
  图片上传的流程图

一、控制器调用
public function upload_file() {
if (IS_POST) {
if (!empty($_FILES['Filedata'])) {
import('Org.Upload', COMMON_PATH);
$upload = new \Upload();
// 允许上传文件大小
$upload->allowMaxSize(C('ALLOW_UPLOAD_FILE_MAX_SIZE'));
// 允许上传的文件类型
$upload->allowExt(C('ALLOW_UPLOAD_FILE_TYPE'));
// 获取上传文件的信息
$upload->get_upload_file_info($_FILES['Filedata']);
// 指定上传目录
$upload->root_dir(ROOT_PATH);
// 生成文件名
$file_name = $upload->upload_file_name();
// 保存到指定的目录
$res = $upload->save_file('Uploads/', $file_name);
if ($res === false) {
dump($upload->get_error());
} else {
echo '上传成功';
}
}
}
}

  

二、文件上传类代码
<?php

/**
* @desc 文件上传类
* @author Timothy
* Created by PhpStorm.
* Date: 2016/10/17
* Time: 12:18
*/
class Upload
{
protected $_error = '';
protected $_allowExt = array();
protected $_allowSize = 0;
protected $file_info = null;
protected $_root_dir = null; /**
* @desc 上传文件信息
* @param array $file_info
* @return bool
*/
public function get_upload_file_info(array $file_info = array()) {
// 判断错误号是否>0
if ($file_info['error'] > 0) {
$this->_checkError($file_info['error']);
} // 判断是否是通过HTTP POST方式上传
if (!is_uploaded_file($file_info['tmp_name'])) {
$this->_error = '文件不是通过HTTP POST方式上传的';
return false;
} $this->file_info = $this->_format_upload_file_info($file_info);
} /**
* @desc 格式化上传文件的信息
* @param array $file_info
* @return array
*/
private function _format_upload_file_info(array $file_info = array()) {
$pathinfo = pathinfo($file_info['name'], PATHINFO_EXTENSION);
$file_info['extension'] = $pathinfo;
return $file_info;
} // 上传文件的错误信息处理
private function _checkError($file_error = '') {
switch ($file_error) {
case UPLOAD_ERR_INI_SIZE:
$this->_error = '上传文件超过了PHP配置文件中upload_max_filesize选择项的值';
return false;
break;
case UPLOAD_ERR_FORM_SIZE:
$this->_error = '超过了表单MAX_FILE_SIZE限制的大小';
return false;
break;
case UPLOAD_ERR_PARTIAL:
$this->_error = '文件部分被上传';
return false;
break;
case UPLOAD_ERR_NO_FILE:
$this->_error = '没有文件被上传';
return false;
break;
case UPLOAD_ERR_NO_TMP_DIR :
$this->_error = '找不到临时文件';
return false;
break;
case UPLOAD_ERR_CANT_WRITE:
$this->_error = '文件写入失败';
return false;
break;
case UPLOAD_ERR_EXTENSION:
$this->_error = '文件类型不正确';
return false;
break;
default:
$this->_error = '系统错误';
return false;
break;
}
} /**
* @desc 判断上传文件的类型
* @param string $file_type
* @return bool
*/
private function _checkExt($file_type = '') {
if (!in_array($file_type, $this->_allowExt)) {
$this->_error = '上传的文件类型不正确';
return false;
}
return true;
} /**
* @desc 判断上传文件的大小
* @param int $file_size
* @return bool
*/
private function _checkSize($file_size = 0) {
if ($file_size > $this->_allowSize) {
$this->_error = '上传的图片过大';
return false;
}
return true;
} /**
* @desc 处理允许上传的文件类型
* @param int $max_size
* @return bool|int
*/
public function allowMaxSize($max_size = 2) {
if (!is_numeric($max_size)) {
$this->_error = '允许上传的文件大小不正确';
return false;
}
$this->_allowSize = $max_size * 1024 * 1024;
} /**
* @desc 处理允许上传的文件类型
* @param string $ext
*/
public function allowExt($ext = '') {
$this->_allowExt = explode('|', $ext);
} /**
* @desc 指定路径
* @param none
* @return void
*/
public function root_dir($dir) {
$this->_root_dir = $dir;
} /**
* @desc 递归创建目录
* @param $path
* @return bool
*/
private function _mkdir($path) {
if (!is_dir($path)) {
if (@mkdir($path, 0777, true))
return true;
else
$this->_error = '目录创建失败';
return false;
} else {
return true;
}
} // 生成一个唯一的文件名,防止因重名而被覆盖
public function upload_file_name() {
return md5(uniqid(microtime(true), true)) . '.' . $this->file_info['extension'];
} /**
* @desc 把上传的临时文件保存到指定目录
* @param string $path
* @param string $file_name
* @return string
*/
public function save_file($path = '', $file_name = '') {
// 判断是否是合法的文件类型
if (!$this->_checkExt($this->file_info['extension'])) {
return false;
} // 判断是否是合法的文件大小
if (!$this->_checkSize($this->file_info['size'])) {
return false;
} if (!$this->_checkTrueImage($this->file_info['tmp_name'])) {
return false;
} $abs_path = $this->_root_dir ? $this->_root_dir . $path : $path ;
if ($this->_mkdir($abs_path)) {
if (move_uploaded_file($this->file_info['tmp_name'], $abs_path . $file_name)) {
@chmod($abs_path, 0666);
return $abs_path;
}
} else {
$this->_error = '上传文件失败';
}
} /**
* @desc 判断是否是真实的图片
* @param string $file_info
* @return bool
*/
private function _checkTrueImage($file_info = '') {
if (!getimagesize($file_info)) {
$this->_error = '文件不是真实的图片';
return false;
}
return true;
} /**
* @desc 获取上传错误信息,然后返回
* @return string
*/
public function get_error() {
return $this->_error;
}
}

  

												

PHP图片上传类的更多相关文章

  1. [上传下载] C# ImageUpload图片上传类教程与源码下载 (转载)

    点击下载 ImageUpload.zip 功能如下图片1.设置属性后上传图片,用法如下 /// <summary> /// 图片上传类 /// </summary> //--- ...

  2. PHP多图片上传类推荐

    多文件上传是PHP中的一个基础应用,反正PHPer都会遇到的问题,现在就介绍一个功能完善.强大的多文件上传类给大家吧,能用上这个类的地方会很多. <?php class Upload{ var ...

  3. 阿里云OSS图片上传类

    1.阿里云基本函数 /** * 把本地变量的内容到文件 * 简单上传,上传指定变量的内存值作为object的内容 */ public function putObject($imgPath,$obje ...

  4. PHP之图片上传类(加了缩略图)

    有缩略图功能 但是 感觉不全面,而且有点问题,继续学习,将来以后修改下 <form action="<?php $_SERVER['PHP_SELF']; ?>" ...

  5. laravel之引入图片上传类

    1.在官网http://www.uploadify.com/ 下载插件,flash verison 的版本是免费版 2.解压后将文件夹放置在指定的目录下 3.前端导入css,js文件,可以仿照文件夹中 ...

  6. ASP.NET 图片上传工具类 upload image简单好用功能齐全

    使用方法: UploadImage ui = new UploadImage(); /***可选参数***/ ui.SetWordWater = "哈哈";//文字水印 // ui ...

  7. THINKPHP源码学习--------文件上传类

    TP图片上传类的理解 在做自己项目上传图片的时候一直都有用到TP的上传图片类,所以要进入源码探索一下. 文件目录:./THinkPHP/Library/Think/Upload.class.php n ...

  8. yii php 图片上传与生成缩略图

    今天需要做图片上传与生成缩略图的功能,把代码进行记录如下: html 视图              ($pic_action_url = $this->createAbsoluteUrl('h ...

  9. yii2.0 图片上传(摘录)

    文章来源:http://blog.sina.com.cn/s/blog_88a65c1b0101izmn.html 下面小伙就带领大学学习一下 Yii2.0 的图片上传类的使用,还是老样子,如果代码样 ...

随机推荐

  1. 发现 OpenStack: 架构、功能和交互

    原文:http://www.ibm.com/developerworks/cn/cloud/library/cl-openstack-overview/index.html OpenStack 是由 ...

  2. 使用VNET-to-VNET连接Microsoft Azure国际版和中国版

    Microsoft Azure的VNET-to-VNET功能可以实现跨虚拟网络的VPN连接,通过VNET-to-VNET互联的两个虚拟网络可以在同一个订阅下或者隶属不同的订阅,而且可以跨数据中心.这实 ...

  3. 面试问题5:const 与 define 宏定义之间的区别

    问题描述:const 与 define 宏定义之间的区别 (1) 编译器处理方式不同     define宏是在预处理阶段展开:     const常量是编译运行阶段使用: (2) 类型和安全检查不同 ...

  4. UVALive 4870 Roller Coaster --01背包

    题意:过山车有n个区域,一个人有两个值F,D,在每个区域有两种选择: 1.睁眼: F += f[i], D += d[i] 2.闭眼: F = F ,     D -= K 问在D小于等于一定限度的时 ...

  5. HDU1890 Robotic Sort[splay 序列]

    Robotic Sort Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tota ...

  6. 第二章 spring

    一.Bean作用域 spring容器创建的时候,会将所有配置的bean对象创建出来,默认bean都是单例的.代码通过getBean()方法从容器获取指定的bean实例,容器首先会调用Bean类的无参构 ...

  7. python使用you-get模块下载视频

    pip install you-get # 安装先 怎么用    进入命令行: you-get url 暂停下载:ctrl + c ,继续下载重复  you-get url 官网地址:https:// ...

  8. IIS短文件名暴力枚举漏洞利用脚本

    import sys import httplib import urlparse import threading import Queue import time class Scanner(): ...

  9. 老生长谈:css实现右侧固定宽度,左侧宽度自适应

    反过来也可以:左侧宽度固定,右侧自适应.不管是左是右,反正就是一边宽度固定,一边宽度自适应. 这种布局比较常见,博客园很多默认主题就是这种.一般情况下,这种布局中宽度固定的区域是侧边栏,而自适应的区域 ...

  10. Fluent Nhibernate之旅(五)--利用AutoMapping进行简单开发

    Fluent Nhibernate(以下简称FN)发展到如今,已经相当成熟了,在Nhibernate的书中也相应的推荐了使用FN来进行映射配置,之前写的FN之旅至今还有很多人会来私信我问题,说来惭愧, ...